Compare commits

...

179 Commits

Author SHA1 Message Date
Thomas Leung
49aacc151d [WIFI-4417] add logic to always start with wan port for eth_ports configuration 2021-10-26 12:55:50 -04:00
Thomas-Leung2021
077c535750 Update pom.xml 2021-10-22 20:48:55 -04:00
Thomas-Leung2021
6110a8d78d Merge pull request #69 from Telecominfraproject/WIFI-4417-2
[Wifi-4417] fixes for WiredEthernetPorts
2021-10-22 20:25:14 -04:00
Thomas Leung
5614d87f79 Merged in NETEXP-3321 (pull request #24)
[NETEXP-3321] Move back to NAT mode when EthernetPort Profile removed from AP

Approved-by: rahul.sharma
2021-10-22 20:04:39 -04:00
Thomas Leung
ca511c70c1 Merged in NETEXP-3299 (pull request #22)
[NETEXP-3299] add logic when AP has more than one LAN port to configure

Approved-by: rahul.sharma
2021-10-22 20:03:20 -04:00
norm-traxler
836fbc95ca Merge pull request #67 from Telecominfraproject/WIFI-4732
WIFI-4732 Default 5G backup channel is not applicable to all countrie…
2021-10-20 16:04:52 -04:00
Thomas Leung
1d11b96a7d Merged in NETEXP-3230 (pull request #21)
[NETEXP-3230] fix for not populating Node_Config table

Approved-by: Ralph.lee
2021-10-20 13:08:47 -04:00
Mike Hansen
36ab26df07 [WIFI-4950] Opensync: Metrics is not reported for active DFS channel
Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2021-10-20 12:42:33 -04:00
Lynn Shi
dcfefa2adb WIFI-4732 Default 5G backup channel is not applicable to all countries (add debug) 2021-10-19 22:48:39 -04:00
Rahul Sharma
3647fd6bec Merge pull request #66 from Telecominfraproject/WIFI-4417-2
[WIFI-4417] Adding WiredPort profile to Model and configure AP Ethernet Switch Ports
2021-10-17 21:43:09 -04:00
Thomas Leung
738b2f013e [WIFI-4417] Adding WiredPort profile to Model and configure AP Ethernet Switch Ports 2021-10-15 20:59:03 -04:00
norm-traxler
55096881f6 Merge pull request #65 from Telecominfraproject/WIFI-4422
[WIFI-4422] remove MqttStatsPublisherTest.java
2021-09-27 17:32:55 -04:00
Thomas-Leung2021
ca40563375 [WIFI-4422] remove MqttStatsPublisherTest.java 2021-09-27 17:29:01 -04:00
norm-traxler
0fb70603b4 Merge pull request #64 from Telecominfraproject/WIFI-4422
[WIFI-4422] Performance improvements for gateway
2021-09-27 15:24:59 -04:00
Thomas-Leung2021
c5127e4d8e NETEXP-2801 optimise getBssidForClientSsid() to improve performance 2021-09-27 15:06:33 -04:00
Thomas-Leung2021
dfd7e13399 [NETEXP-2801] remove extra logs 2021-09-27 15:06:33 -04:00
Thomas-Leung2021
b48f340d11 [NETEXP-2801] optimize alarm logic to increase ApNode metric performance 2021-09-27 15:06:33 -04:00
Thomas-Leung2021
a520690976 [NETEXP-2801] Make Stats and Events publishing asynchronous 2021-09-27 15:06:33 -04:00
Thomas-Leung2021
ec617cb47f [NETEXP-2957] remove rates unused calls 2021-09-27 14:41:46 -04:00
Thomas-Leung2021
6b7dcd4878 [NETEXP-2994] add checks for null certificate 2021-09-27 14:39:20 -04:00
norm-traxler
4d919cf21e Merge pull request #63 from Telecominfraproject/WIFI-4415
[Wifi 4415] Add Gateway and backend support to turn LED on/off
2021-09-27 11:05:13 -04:00
Thomas Leung
2bf00e82a7 Merged in NETEXP-2959 (pull request #10)
NETEXP-2959 change LED on/off logic from EquipmentProfile to AP Profile

Approved-by: mike.hansen
2021-09-24 17:09:50 -04:00
Thomas-Leung2021
9f9e469b17 [NETEXP-2959] change LED on/off logic 2021-09-24 17:09:33 -04:00
Thomas-Leung2021
6a75356441 [NETEXP-2959] Redo processBlinkRequest() logic 2021-09-24 17:09:33 -04:00
Thomas Leung
40277e3799 Merged in NETEXP-2959 (pull request #9)
[NETEXP-2959] add support to turn LED on/off via AP profile on gateway

Approved-by: mike.hansen
2021-09-24 17:09:33 -04:00
Thomas-Leung2021
7e0da1505e Merge pull request #61 from Telecominfraproject/WIFI-2079
[WIFI-2079] change survey_interval_ms from 50ms to 120ms
2021-08-26 13:11:03 -04:00
Thomas-Leung2021
b3a15d06a2 [WIFI-2079] change survey_interval_ms from 50ms to 120ms 2021-08-24 15:13:24 -04:00
Mike Hansen
66daa8bc60 [WIFI-3472] AP creates a custom WAN.VLAN interface and obtains an IP address on it
Vlan Fix for Wifi_Inet_Config

Remove vlan on 'lan' interface
For vlan on 'wan' interface, set the ip_assign_scheme to "none"

Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2021-08-16 11:28:42 -04:00
Mike Hansen
91dde5d3d7 [WIFI-2942] APNOS: RF Profile: Values not configured on AP for certain fields and no check on values in AP
As part of revert, set the survey_interval_ms for off-chan stats back to
50 millis

Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2021-08-10 12:06:03 -04:00
Thomas-Leung2021
949c8cb37f [WIFI-3358] remove client metric setSessionId in MqttStatsPublisher 2021-08-09 15:55:44 -04:00
Mike Hansen
5ebecaf88f REVERT of [WIFI-2942] APNOS: RF Profile: Values not configured on AP for certain fields and no check on values in AP
AP does not support the functionality at present

Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2021-08-09 13:24:24 -04:00
Mike Hansen
884efdbf08 [WIFI-2942] APNOS: RF Profile: Values not configured on AP for certain fields and no check on values in AP
When active scan is enabled for a RadioType in the RfProfile, use the
scan duration millis and scan frequency seconds values for the
Wifi_Stats_Config survey_interval_ms and sampling_interval respectively.

This does not affect the cadence at which the stats are reported.

Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2021-08-06 14:26:59 -04:00
Mike Hansen
65c05caf1f [WIFI-3363] GW: ClientSession updates and SystemEvent performance improvements for OpensyncStats EventReport
Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2021-08-06 10:44:50 -04:00
Thomas-Leung2021
a72a147afe [WIFI-3344] remove artifact from removing ClientSessionMetricDetails() 2021-08-04 19:33:12 -04:00
Mike Hansen
8110f796c9 [WIFI-3345] If DATE from version_matrix does not contain year, upgrade to firmware specified in the track version
Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2021-08-04 16:03:51 -04:00
Mike Hansen
2b187ed68d AP is not upgraded to target version after its provisioned for first time.
Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2021-08-03 17:55:25 -04:00
Mike Hansen
a4559b4f37 [WIFI-3287] Some metrics show choppy behavior while the others are OK
Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2021-07-29 11:27:24 -04:00
Mike Hansen
8105c5bc9d Some metrics show choppy behavior while the others are OK
Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2021-07-28 15:15:12 -04:00
Thomas-Leung2021
1409d75dd9 Revert "[WIFI-3129] set createTimestamp in Channel, ActiveBSSID, Lan, and Protocol status"
This reverts commit a6cb5ae939.
2021-07-28 09:58:42 -04:00
Thomas-Leung2021
a6cb5ae939 [WIFI-3129] set createTimestamp in Channel, ActiveBSSID, Lan, and Protocol status 2021-07-23 11:38:42 -04:00
Mike Hansen
fb3963e750 Merge branch 'WIFI-3129' 2021-07-23 11:09:33 -04:00
Thomas-Leung2021
b7779f3137 fix merge conflict 2021-07-23 10:56:38 -04:00
Kareem Dabbour
9b3f6f5cb2 WIFI-3216 using 0 rather than currentMillis() 2021-07-23 08:04:38 -04:00
Kareem Dabbour
d026266bfa WIFI-3216 using currentMillis() rather than 0 2021-07-23 08:04:38 -04:00
Kareem Dabbour
27f406a615 WIFI-3216 Made the service metrics' timestamps 0 so that the CloudEventDispatcherController can assign unique TS 2021-07-23 08:04:38 -04:00
Thomas-Leung2021
b15dbc61af set createTimestamp in status 2021-07-22 18:48:01 -04:00
Mike Hansen
14adaaacbe APs running into Backoff shows as connected
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-22 15:32:21 -04:00
Mike Hansen
11f0aa8856 APs running into Backoff shows as connected.
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-22 13:38:06 -04:00
Mike Hansen
cbd27b37bf APs running into Backoff shows as connected.
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-21 10:56:39 -04:00
Mike Hansen
80834c0a31 Logs: Client Devices: isReassociation Flag is set to TRUE always
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-20 14:40:27 -04:00
Mike Hansen
45642464fc [WIFI-3181] check for null customer equipment when processing ovsdb table state updates
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-20 11:48:20 -04:00
Mike Hansen
be9d880bc3 [WIFI-3166] Session ID is a -ve number in opensyncgw logs and on UI logs
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-19 19:31:18 -04:00
Mike Hansen
711fea3407 [WIFI-3165] Keep last stats received timestamp in gateway client session map
Support call from portal to get metric timestamp for APs ovsdb session

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-19 14:14:59 -04:00
Mike Hansen
e5e7ac7e8b [WIFI-3165] Keep last stats received timestamp in gateway client session map
Add API call to controller to get timestamp.

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-19 12:25:56 -04:00
Mike Hansen
6264a8c490 [WIFI-3165] Keep last stats received timestamp in gateway client session map
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-19 11:40:10 -04:00
Mike Hansen
1070708b44 [WIFI-3031] Proxy_arp is set to 0 in bridge mode config
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-16 09:44:48 -04:00
Mike Hansen
80845aa800 Associated Client Rx and Unassociated Client Rx graphs are overlapping
Fix calc error for nonWifi

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-15 16:00:11 -04:00
Mike Hansen
7a646fd459 Associated Client Rx and Unassociated Client Rx graphs are overlapping
Updates needed:
AssociatedClientRx = Rx for Self

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-15 15:29:04 -04:00
Mike Hansen
905f37cc68 [WIFI-3049] Write LOG when time for received statistics is greater than Threshold from the current System time.
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-15 13:30:15 -04:00
Mike Hansen
1a58b3af01 OpensyncGatewayController:
Control LED off via Equipment AP profile and Show LED status in EQUIPMENT_ADMIN status

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-14 17:33:31 -04:00
Mike Hansen
bb130e5f3e Add debug information for wifi radio configuration
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-14 12:06:56 -04:00
Mike Hansen
b8e4c404bb Improvements:
WIFI-2989: Remove dependency on customerid from ovsdb session
WIFI-2988: Ovsdb schema check for Wifi_Radio_Config and Wifi_RRM_Config

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-12 18:31:08 -04:00
Mike Hansen
42a520b7ec MQTT message delivery reliability
- MqttStatsPublisher measure time for overall and per report metrics generation

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-08 19:10:26 -04:00
Mike Hansen
90b0da4850 Add logging of mqtt trace to docker images
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-08 12:34:24 -04:00
Mike Hansen
b842c532a8 MQTT changes:
Remove MQTT message hop from OpensyncExternalIntegrationInterface
  Add separate logging for mqtt msg tracing

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-08 09:36:19 -04:00
Mike Hansen
785dc0e6c4 MQTT Client analysis and optimization
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-07-07 13:30:32 -04:00
Thomas-Leung2021
927ce4e589 change to getByInventoryIdOrNull() with updated test 2021-07-06 18:00:34 -04:00
Mike Hansen
c287f7cdc6 Revert "change getOrNull() to getByInventoryIdOrNull() to get equipment"
This reverts commit 2aa51afe9d.
2021-07-06 16:28:29 -04:00
Thomas-Leung2021
2aa51afe9d change getOrNull() to getByInventoryIdOrNull() to get equipment 2021-07-06 16:15:07 -04:00
Norm Traxler
716e5d8129 [WIFI-2932] Change client IP event to InetAddress 2021-07-06 10:11:19 -04:00
Norm Traxler
4f462ecf70 [WIFI-2670] Change log for debugging 2021-06-28 23:17:47 -04:00
norm-traxler
fc61328fc4 Merge pull request #48 from Telecominfraproject/hotfix/netexp-2342
fix bug for cannot find alarm to be deleted exception
2021-06-28 19:43:34 -04:00
Thomas-Leung2021
18698fc188 fix bug for cannot find alarm to be deleted exception 2021-06-28 19:05:01 -04:00
Mike Hansen
34a6baf956 Merge branch 'master' of github.com:Telecominfraproject/wlan-cloud-opensync-controller 2021-06-25 13:55:13 -04:00
Mike Hansen
2e3b0c277a WIFI-1489: AP: Disable local access not working as expected
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-25 13:51:00 -04:00
Thomas-Leung2021
4370753206 add tx_power status 2021-06-25 13:25:19 -04:00
Mike Hansen
aaa584ca3c Merge pull request #46 from Telecominfraproject/mqtt_client_analysis_and_optimization
MQTT Client analysis and optimization
2021-06-24 10:22:46 -04:00
Mike Hansen
210976887f MQTT Client analysis and optimization
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-23 17:43:01 -04:00
Mike Hansen
43f53ee0be Merge pull request #45 from Telecominfraproject/disable_eq_alarms_sp
Move the raising and clearing of the threshold alarms into the gatewa…
2021-06-22 16:04:18 -04:00
Mike Hansen
1381451989 Move the raising and clearing of the threshold alarms into the gateway controller when the device information is received in the MQTT device report. Update EquipmentAdminState alarms or clear if required.
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-22 15:52:14 -04:00
Mike Hansen
6124309dbb Move the raising and clearing of the threshold alarms into the gateway controller when the device information is received in the MQTT device report. Update EquipmentAdminState alarms or clear if required.
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-22 14:17:12 -04:00
Mike Hansen
f2e30505e5 Move the raising and clearing of the threshold alarms into the gateway controller when the device information is received in the MQTT device report. Update EquipmentAdminState alarms or clear if required.
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-22 12:46:10 -04:00
Mike Hansen
bda589e65e Move the raising and clearing of the threshold alarms into the gateway controller when the device information is received in the MQTT device report. Update EquipmentAdminState alarms or clear if required.
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-22 12:31:30 -04:00
Mike Hansen
5a98d4bd83 Merge branch 'disable_eq_alarms_sp' of github.com:Telecominfraproject/wlan-cloud-opensync-controller into disable_eq_alarms_sp 2021-06-22 11:27:09 -04:00
Mike Hansen
a772cbe7fa WIFI-2697: Remove old parameter from captive portal configuration on Gateway side
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-22 11:19:18 -04:00
Mike Hansen
11adb02fd2 Move the raising and clearing of the threshold alarms into the gateway controller when the device information is received in the MQTT device report. Update EquipmentAdminState alarms or clear if required.
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-22 11:12:59 -04:00
Mike Hansen
9aa4a102a5 Move the raising and clearing of the threshold alarms into the gateway controller when the device information is received in the MQTT device report. Update EquipmentAdminState alarms or clear if required.
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-22 10:23:21 -04:00
Mike Hansen
d482b4062f WIFI-2686: RADSEC: APs are running into Backoff with AP Proxy config
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-21 17:01:37 -04:00
Mike Hansen
ee49415b0a WIFI-2052: Country Code displayed in UI doesn't match AP
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-21 14:10:37 -04:00
Mike Hansen
cc035e7fe1 WIFI-2686: RADSEC: APs are running into Backoff with AP Proxy config
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-19 17:38:23 -04:00
Mike Hansen
d617efbcc1 Merge pull request #44 from Telecominfraproject/WPA3EAP192
[WIFI-2646] add support for WPA3-Enterprise 192-Bit
2021-06-17 14:28:16 -04:00
Thomas-Leung2021
53f19028dc add support for WPA3-Enterprise 192-Bit 2021-06-17 12:03:22 -04:00
Mike Hansen
f2b4b616ad Merge pull request #43 from Telecominfraproject/hotfix/NETEXP-2077
remove metrics from ClientSession
2021-06-15 10:20:57 -04:00
Thomas-Leung2021
9802ed2a3f remove metrics from ClientSession 2021-06-14 16:40:26 -04:00
Mike Hansen
cfc5caee64 WIFI-2638: Gateway: Support blink or turn off of LEDs on AP from CloudSDK BlinkRequest
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-14 12:00:48 -04:00
Mike Hansen
b0abd3847a WIFI-2625: CloudGateway: when using RadSec and dynamicDiscovery, do not populate server(s) in Radius_Proxy_Config
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-10 11:15:40 -04:00
Mike Hansen
71c947427b WIFI-2608: CloudGateway: provision dynamicDiscovery attribute on AP
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-09 15:13:27 -04:00
Mike Hansen
0dc72a6fe4 Merge pull request #42 from Telecominfraproject/fixBugs
fix wrong alarm timestamp
2021-06-09 14:40:18 -04:00
Thomas-Leung2021
5540d83dd3 fix the bug I create for wrong alarm timestamp 2021-06-09 14:11:05 -04:00
Mike Hansen
572f48445c WIFI-2605: Fix NPE dereference in OSGW controller when used with simulated cloud backend
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-09 13:17:55 -04:00
Mike Hansen
4df8bda2b3 WIFI-2396: CloudGateway: Universal (Auto) Radio Mode For Configuration
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-08 10:15:06 -04:00
Mike Hansen
047ce7f07a WIFI-2081: AP: ON_CHANNEL survey report sometimes has no information
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-07 15:28:05 -04:00
Mike Hansen
1264640c33 Merge pull request #41 from Telecominfraproject/hotfix/WIFI-2058
added Alarm when AP disconnected
2021-06-07 14:19:52 -04:00
Thomas-Leung2021
eef372cf0d added Alarm when AP disconnected 2021-06-07 12:36:30 -04:00
Mike Hansen
fcccf418dd Merge pull request #40 from Telecominfraproject/hotfix/NETEXP-1721
assigned rx/tx to the correct variables
2021-06-02 15:52:36 -04:00
Thomas-Leung2021
c098cd72b6 assigned rx/tx to the correct variables 2021-06-02 15:46:07 -04:00
Mike Hansen
42ecccee5e WIFI-2441: RADSEC/PROXY config when done from UI
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-02 12:14:12 -04:00
Mike Hansen
663340e749 AP: ON_CHANNEL survey report sometimes has no information
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-06-02 09:08:08 -04:00
norm-traxler
01c7f270ad Merge pull request #39 from Telecominfraproject/WIFI-2519-clientTxFrames
WIFI-2519 Check client metrics has TxFrames before assigning it
2021-06-01 13:23:51 -04:00
Christie Unitt
91c17a6271 WIFI-2519 Check client metrics has TxFrames before assigning it 2021-06-01 13:17:02 -04:00
norm-traxler
92235affee Merge pull request #38 from Telecominfraproject/WIFI-2434
WIFI 2434: Update SDK master to use image tag 1.2.0-SNAPSHOT
2021-05-26 21:18:30 -04:00
Akshay Jagadish
bbe36d4a9f Update SDK master to use image tag 1.2.0-SNAPSHOT 2021-05-26 18:00:18 -04:00
Mike Hansen
3c9ee65742 WIFI-1829: CEGWY support for Excessive NF and ChanOcc channel change
Adding support for Non-Wifi Thresholds

Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-20 19:04:11 -04:00
Mike Hansen
53022b5813 WIFI-1829: CEGWY support for Excessive NF and ChanOcc channel change
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-20 18:19:54 -04:00
Mike Hansen
b59a40afc0 Merge pull request #37 from Telecominfraproject/WIFI-2408
WIFI-2408 Support UnassocClientRx setting in RadioUtilization based o…
2021-05-20 17:28:48 -04:00
Mike Hansen
3447df19ef WIFI-2030: SDK Gateway/BE: Proxy-ARP service
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-20 17:02:06 -04:00
Lynn Shi
de671722f7 WIFI-2408 Support UnassocClientRx setting in RadioUtilization based on Mqtt data 2021-05-20 11:58:38 -04:00
Mike Hansen
6b7c418ccd Client Devices: Access Point appearing in Client device inventory
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-20 10:43:11 -04:00
Mike Hansen
e6472cf80b WIFI-2397: Add ApcElectionEvent values to EquipmentProtocolStatusData
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-19 18:00:58 -04:00
Mike Hansen
07489c2550 WIFI-2120: AP: Support 8x8 MIMO and Max Tx Power
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-19 16:36:41 -04:00
Mike Hansen
f39f148706 WIFI-2118: Gateway: populate new values acct_server, acct_port, acct_secret, and secret in Radius_Proxy_Config
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-05-07 10:54:52 -04:00
Mike Hansen
e0c26b66e0 Merge pull request #36 from Telecominfraproject/WIFI-2096
WIFI-2096 Add Portal support for cell size management
2021-05-07 10:34:30 -04:00
Lynn Shi
ee1350fbe9 WIFI-2096 Add Portal support for cell size management, update comments 2021-05-06 11:08:40 -04:00
Lynn Shi
b7a3564153 WIFI-2096 Add Portal support for cell size management 2021-05-05 16:25:57 -04:00
Mike Hansen
e173e02eae Merge pull request #35 from Telecominfraproject/WIFI-2080
WIFI-2080 Add support for cell size attributes lightweight provisioni…
2021-05-04 13:03:35 -04:00
Lynn Shi
1fbc4e1dff WIFI-2080 update based on review comments 2021-04-30 14:00:32 -04:00
Mike Hansen
cd67fc15dd WIFI-2083: Fix Enum labels on Backend
Signed-off-by: Mike Hansen <mike.hansen@connectus.ai>
2021-04-30 12:12:31 -04:00
Lynn Shi
a98cca3d8c WIFI-2080 Add support for cell size attributes lightweight provisioning changes to AP 2021-04-29 18:21:59 -04:00
Mike Hansen
4552118b4e WIFI-2067: Enable setting default reporting interval for on and off-channel wifi stats as VM args 2021-04-26 12:29:01 -04:00
Mike Hansen
67abbc0bc7 WIFI-1730: Syslog configuration does't work 2021-04-23 15:00:16 -04:00
Mike Hansen
9d33afec93 WIFI-2043: CustomerPortalDashboardStatus counts incorrect. 2021-04-21 11:42:32 -04:00
Mike Hansen
1bdecada9b WIFI-2040: ECW5211, ECW5410, WF194C, WF188N in backoff after upgrade 2021-04-20 14:09:13 -04:00
norm-traxler
9b31e67822 Merge pull request #34 from Telecominfraproject/WIFI-2026
WIFI-2026 Changed pom versions from 0.0.1-SNAPSHOT to 1.1.0-SNAPSHOT
2021-04-16 17:09:14 -04:00
Akshay Jagadish
1af6b363b8 WIFI-2026 Changed pom versions from 0.0.1-SNAPSHOT to 1.1.0-SNAPSHOT 2021-04-16 15:28:03 -04:00
norm-traxler
04c6a13675 Merge pull request #33 from Telecominfraproject/WIFI-2007
WIFI-2007 Cloud: Sometime the Noise value reported in SurveySample fo…
2021-04-15 10:35:37 -04:00
Lynn Shi
44238de99a WIFI-2007 update based on review comments 2021-04-14 18:54:58 -04:00
Lynn Shi
d644fa5e37 WIFI-2007 Cloud: Sometime the Noise value reported in SurveySample for OnChannel is 0 2021-04-14 12:10:23 -04:00
Mike Hansen
1e74c777fd WIFI-1994: NAS-ID use BSSID as default, to support EAP with 11r
When in EAP/Radius security mode, and 80211r is enabled, enforce that
radius_nas_id can only be the BSSID of the SSID being created.
2021-04-08 14:47:58 -04:00
Mike Hansen
d43a1d0f7b WIFI-1994: NAS-ID use BSSID as default, to support EAP with 11r 2021-04-08 12:21:40 -04:00
Mike Hansen
d2e3fa7a72 WIFI-1983: Use SSID UL/DL limit values for the Client UL/DL limit tags in the AP's custom_options 2021-04-06 14:45:42 -04:00
Mike Hansen
f96b5b4bed WIFI-1947: OpensyncGateway - ApNode use only ON channel survey data 2021-04-06 13:32:01 -04:00
Mike Hansen
eeeec8999f WIFI-1529: CP: Open+Radius Captive Portal Auth doesn't work 2021-04-06 11:38:59 -04:00
Mike Hansen
052bad3ef2 Merge pull request #32 from Telecominfraproject/WIFI-1958
WIFI-1958 Sometimes OnChannel is not reported on Channel Metric
2021-04-01 16:30:59 -04:00
Lynn Shi
cc007f6115 WIFI-1958 Sometime OnChannel is not reported on Channel Metric 2021-04-01 16:07:41 -04:00
Mike Hansen
18dbc3fe96 Ensure instance of Client of non-wifi type exists before trying to remove based only on session 2021-03-30 12:29:53 -04:00
Mike Hansen
ee4cf9ff59 WIFI-1916: Gateway: align sku_number formats to match AP Manufacturing Data desired format 2021-03-30 12:23:17 -04:00
Mike Hansen
cfa8c7e039 WIFI-1851: Backend: Modelling manufacturing identity data
Validate MAC address format, enable generation of status, but validate
all inputs for 'null' to avoid NPE if the entries are not present in the
AWLAN_Node db table.
2021-03-26 12:11:23 -04:00
Mike Hansen
4565d7a446 WIFI-1879: Get Status API return normal for AP that are not connected 2021-03-26 10:47:00 -04:00
Mike Hansen
89f608b5bc WIFI-1851: Backend: Modelling manufacturing identity data
Pre work for removing ManufacturerName enum.
2021-03-25 15:14:13 -04:00
Mike Hansen
0fda8b51bf Add timestamp from NeighbourScanReport to NeighbourReport, convert to seconds 2021-03-25 12:14:20 -04:00
Mike Hansen
180fc3ceb1 WIFI-1514: AP-NOS Network: Client Devices: Client device status not updated correctly.
Adding logs to aide debugging.
Ensure associationStatus is set properly for ClientSessions.
IP address is set correctly initially, for ClientSessions, it gets set
incorrectly due to the incorrect ByteString set by the AP in the
ClientIpEvent. This overwrites the previous good value, for example,
10.0.0.250, with a nonsense value, i.e. 104.19.189.0
AP needs to investigate this part of the issue.
2021-03-24 21:55:21 -04:00
Mike Hansen
9607124360 WIFI-1851: Backend: Modelling manufacturing identity data -- disable functions pending AP load availability 2021-03-24 13:41:21 -04:00
Mike Hansen
acf798bbc9 WIFI-1851: Backend: Modelling manufacturing identity data -- get EquipmentManufacturer by manufacturer name, not just enum name 2021-03-23 17:40:22 -04:00
Mike Hansen
1cee28a694 WIFI-1732: Acct-Interim-Interval config not working when configured from radius -- If radius accounting interval for SSID is set to 0, do not set in the Wifi_VIF_Config 2021-03-23 15:59:42 -04:00
Mike Hansen
68037ecf80 WIFI-1849: Gateway: Update status with additional manufacturing data 2021-03-23 15:23:16 -04:00
Mike Hansen
7eb9ea5039 WIFI-1096: Configure multicast and beacon rate in Wifi_RRM_Config 2021-03-23 09:47:33 -04:00
Mike Hansen
89f9e2b11e Remove appending of filestore to externalFileStoreURL, this will be set in deployment 2021-03-22 17:59:51 -04:00
Mike Hansen
087fb461a9 WIFI-1848: Gateway: Support new AWLAN_Node columns for manufacturing identity data
WIFI-1849: Gateway: Update status with additional manufacturing data
2021-03-22 17:55:43 -04:00
Mike Hansen
c9e93e2bb3 WIFI-1808: AP-NOS Passpoint : Access type and internet value is not getting set Interworking element in Beacon for passpoint SSID
Fix error setting internet in Hotspot20_Config table had wrong attribute
referenced from Profile

Add support for "access_network_type", of type int, into the
Hotspot20_Config provisioning, add check to make sure it is only set if
available in schema as AP has not yet modelled in ovsdb schema.
2021-03-18 10:32:26 -04:00
Mike Hansen
0d77847761 WIFI-1808: AP-NOS Passpoint : Access type and internet value is not getting set Interworking element in Beacon for passpoint SSID
Setting missing values in Hotspot20_Config table from Profile
2021-03-17 18:22:45 -04:00
Mike Hansen
4d2d0d3990 WIFI-1803: Design changes/refactoring based on SME feedback and AP design iterations 2021-03-17 11:57:39 -04:00
Mike Hansen
0ad90840fd WIFI-1803: Design changes/refactoring based on SME feedback and AP design iterations 2021-03-16 14:25:51 -04:00
Mike Hansen
ea6e5cf761 WIFI-1698: Services - RadSEC certificates
WIFI-1717: Gateway: Handle table state changes for APC_State
2021-03-15 12:25:09 -04:00
Mike Hansen
1e0fd00d98 WIFI-1695: Gateway: SSID configuration populate radsecproxy when using APC 2021-03-11 16:10:52 -05:00
Mike Hansen
7928dceefb WIFI-453: CloudSDK : Support for APC / Radius Proxy (Back End)
WIFI-1695: Gateway: SSID configuration populate radsecproxy when using APC
WIFI-1693: Gateway: Update EquipmentProtocolStatusData for APC/RadSEC
WIFI-1717: Gateway: Handle table state changes for APC_State
2021-03-10 17:59:41 -05:00
Mike Hansen
4773530305 WIFI-1734: AP not broadcasting Passpoint Access SSID unless OSU SSID is configured in Passpoint Profile 2021-03-10 11:04:54 -05:00
Mike Hansen
a0a12d3c8c WIFI-1694: Gateway: populate radius and realm config tables 2021-03-09 11:45:51 -05:00
Mike Hansen
6fc02664ad WIFI-1697: Add Table State Listener for APC_State table
WIFI-1717: Gateway: Handle table state changes for APC_State
WIFI-1693: Gateway: Update EquipmentProtocolStatusData for APC/RadSEC

Stub/skeleton code for above, still awaiting AP code for finalization and
integration.
2021-03-08 17:00:24 -05:00
Mike Hansen
ff8b0a006c WIFI-835: Captive Portal: User List Authentication feature does not work unless user list is pushed to cloud manually.
avoid adding https:// to externalFilestoreURL.
2021-03-05 17:29:50 -05:00
Mike Hansen
8510882ed8 WIFI-835: Captive Portal: User List Authentication feature does not work unless user list is pushed to cloud manually. 2021-03-05 15:39:01 -05:00
Mike Hansen
d6f907f1af WIFI-1696: Gateway: add models for the realm_config, radius_config, and radsec_proxy ovsdb tables
Adding models for realm_config and radius_config. Still awaiting
definition of radsec proxy table.
2021-03-04 11:54:35 -05:00
ralphlee3
b04cd86cda [WIFI-1358] Adding additional parameter to getSessionsForCustomer (#25) 2021-03-01 15:23:31 -05:00
Mike Hansen
657f61466c Fixed failing test case from WIFI-1658 Add Channel Number Status Support, Mocking correction 2021-02-25 12:46:04 -05:00
Mike Hansen
234c087180 Merge pull request #28 from Telecominfraproject/WIFI-1658
WIFI-1658 Add Channel Number Status Support
2021-02-25 12:01:18 -05:00
Lynn Shi
7d785e3a10 WIFI-1658 update based on review comments 2021-02-25 11:55:29 -05:00
Lynn Shi
738d11b11c WIFI-1658 Add Channel Number Status Support 2021-02-25 09:09:38 -05:00
Dmitry Toptygin
2c787b4fef WIFI-1652 - implement performance counters for ovsdb, cassandra, and kafka 2021-02-23 19:43:27 -05:00
Mike Hansen
23f9da0af0 WIFI-1651: Reduce message for invalid secondary DNS address to warning, cleanup copy/paste mistakes for retry w. byte array if string fails for InetAddress 2021-02-23 18:37:16 -05:00
Mike Hansen
15a7741909 WIFI-1638: Gateway: Implement Wifi_Radio_Config custom_options max_clients from maxNumClients in the RF_Profile 2021-02-23 10:43:45 -05:00
57 changed files with 5089 additions and 4676 deletions

View File

@@ -1,141 +1,139 @@
<?xml version="1.0" encoding="UTF-8"?>
<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">
<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>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>opensync-ext-cloud</artifactId>
<name>opensync-ext-cloud</name>
<description>Configuration interface that provides config from the cloud services.</description>
<dependencies>
<!-- <dependency> -->
<!-- <groupId>com.telecominfraproject.wlan</groupId> -->
<!-- <artifactId>opensync-ext-interface</artifactId> -->
<!-- <version>0.0.1-SNAPSHOT</version> -->
<!-- </dependency> -->
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>opensync-ext-interface</artifactId>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>opensync-gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>base-client</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-gateway-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>customer-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>location-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>profile-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-user-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>status-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>routing-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>firmware-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>manufacturer-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -1,3 +1,4 @@
package com.telecominfraproject.wlan.opensync.external.integration.controller;
import java.util.ArrayList;
@@ -32,6 +33,7 @@ import com.telecominfraproject.wlan.core.model.service.GatewayType;
import com.telecominfraproject.wlan.core.model.service.ServiceInstanceInformation;
import com.telecominfraproject.wlan.core.server.container.ConnectorProperties;
import com.telecominfraproject.wlan.datastore.exceptions.DsEntityNotFoundException;
import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWBaseCommand;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWBlinkRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWChangeRedirectorHost;
@@ -42,6 +44,7 @@ import com.telecominfraproject.wlan.equipmentgateway.models.CEGWConfigChangeNoti
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWFirmwareDownloadRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWFirmwareFlashRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWNewChannelRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWCellSizeAttributesRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWRadioResetRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWRebootRequest;
import com.telecominfraproject.wlan.equipmentgateway.models.CEGWRouteCheck;
@@ -147,19 +150,16 @@ public class OpensyncCloudGatewayController {
String inventoryId = command.getInventoryId();
if (com.telecominfraproject.wlan.core.model.json.BaseJsonModel.hasUnsupportedValue(command)) {
LOG.error("[{}] Failed to deliver command {}, command contains unsupported value", inventoryId,
command);
ret.add(new EquipmentCommandResponse(CEGWCommandResultCode.UnsupportedCommand,
"Unsupported value in command for " + inventoryId, command, registeredGateway.getHostname(),
registeredGateway.getPort()));
LOG.error("[{}] Failed to deliver command {}, command contains unsupported value", inventoryId, command);
ret.add(new EquipmentCommandResponse(CEGWCommandResultCode.UnsupportedCommand, "Unsupported value in command for " + inventoryId, command,
registeredGateway == null ? null : registeredGateway.getHostname(), registeredGateway == null ? -1 : registeredGateway.getPort()));
return;
}
OvsdbSession session = ovsdbSessionMapInterface.getSession(inventoryId);
if (session == null) {
LOG.warn("[{}] Failed to deliver command {}, equipment session not found", inventoryId, command);
ret.add(new EquipmentCommandResponse(CEGWCommandResultCode.NoRouteToCE,
"No session found for " + inventoryId, command, registeredGateway.getHostname(),
registeredGateway.getPort()));
ret.add(new EquipmentCommandResponse(CEGWCommandResultCode.NoRouteToCE, "No session found for " + inventoryId, command,
registeredGateway == null ? null : registeredGateway.getHostname(), registeredGateway == null ? -1 : registeredGateway.getPort()));
return;
}
@@ -199,30 +199,35 @@ public class OpensyncCloudGatewayController {
ret.add(processRadioReboot(session, (CEGWRebootRequest) command));
break;
case ClientBlocklistChangeNotification:
ret.add(sendClientBlocklistChangeNotification(session,
(CEGWClientBlocklistChangeNotification) command));
ret.add(sendClientBlocklistChangeNotification(session, (CEGWClientBlocklistChangeNotification) command));
break;
case NewChannelRequest:
ret.add(sendNewChannelRequest(session, (CEGWNewChannelRequest) command));
break;
case CellSizeAttributesRequest:
ret.add(sendCellSizeRequest(session, (CEGWCellSizeAttributesRequest) command));
break;
// case MostRecentStatsTimestamp:
// ret.add(sendGetMostRecentStatsTimestampRequest(command, inventoryId));
// break;
default:
LOG.warn("[{}] Failed to deliver command {}, unsupported command type", inventoryId, command);
ret.add(new EquipmentCommandResponse(
CEGWCommandResultCode.UnsupportedCommand, "Invalid command type ("
+ command.getCommandType() + ") for equipment (" + inventoryId + ")",
command, registeredGateway.getHostname(), registeredGateway.getPort()));
ret.add(new EquipmentCommandResponse(CEGWCommandResultCode.UnsupportedCommand,
"Invalid command type (" + command.getCommandType() + ") for equipment (" + inventoryId + ")", command,
registeredGateway == null ? null : registeredGateway.getHostname(),
registeredGateway == null ? -1 : registeredGateway.getPort()));
}
}
});
return ret;
}
private EquipmentCommandResponse processFirmwareDownload(OvsdbSession session,
CEGWFirmwareDownloadRequest command) {
private EquipmentCommandResponse processFirmwareDownload(OvsdbSession session, CEGWFirmwareDownloadRequest command) {
return sendMessage(session, command.getInventoryId(), command);
}
@@ -242,6 +247,8 @@ public class OpensyncCloudGatewayController {
public GatewayDefaults retrieveGatewayDefaults() {
return new GatewayDefaults();
}
/**
* Verify a route to customer equipment
@@ -254,19 +261,18 @@ public class OpensyncCloudGatewayController {
if (null != command.getRoutingId()) {
if (!command.getRoutingId().equals(session.getRoutingId())) {
LOG.info("[C:{} E:{} R:{}] Stale routing entry ({}) detected", session.getCustomerId(),
command.getInventoryId(), session.getRoutingId(), command.getRoutingId());
LOG.info("[E:{} R:{}] Stale routing entry ({}) detected", command.getInventoryId(), session.getRoutingId(),
command.getRoutingId());
return new EquipmentCommandResponse(CEGWCommandResultCode.NoRouteToCE, "Inactive Route Identifer",
command, registeredGateway.getHostname(), registeredGateway.getPort());
return new EquipmentCommandResponse(CEGWCommandResultCode.NoRouteToCE, "Inactive Route Identifer", command,
registeredGateway == null ? null : registeredGateway.getHostname(), registeredGateway == null ? -1 : registeredGateway.getPort());
}
}
return new EquipmentCommandResponse(CEGWCommandResultCode.Success, "Route active", command,
registeredGateway.getHostname(), registeredGateway.getPort());
registeredGateway == null ? null : registeredGateway.getHostname(), registeredGateway == null ? -1 : registeredGateway.getPort());
}
private EquipmentCommandResponse sendConfigChangeNotification(OvsdbSession session,
CEGWConfigChangeNotification command) {
private EquipmentCommandResponse sendConfigChangeNotification(OvsdbSession session, CEGWConfigChangeNotification command) {
return sendMessage(session, command.getInventoryId(), command);
}
@@ -276,20 +282,17 @@ public class OpensyncCloudGatewayController {
session.getOvsdbClient().shutdown();
} catch (Exception e) {
LOG.error("[{}] Failed to close session on CE: {}", command.getInventoryId(), e.getLocalizedMessage());
return new EquipmentCommandResponse(
CEGWCommandResultCode.FailedToSend, "Failed to send command " + command.getCommandType() + " to "
+ command.getInventoryId() + ": " + e.getMessage(),
command, registeredGateway.getHostname(), registeredGateway.getPort());
return new EquipmentCommandResponse(CEGWCommandResultCode.FailedToSend,
"Failed to send command " + command.getCommandType() + " to " + command.getInventoryId() + ": " + e.getMessage(), command,
registeredGateway == null ? null : registeredGateway.getHostname(), registeredGateway == null ? -1 : registeredGateway.getPort());
}
LOG.debug("[{}] Closed session to CE", command.getInventoryId());
return new EquipmentCommandResponse(CEGWCommandResultCode.Success,
"Closed session to " + command.getInventoryId(), command, registeredGateway.getHostname(),
registeredGateway.getPort());
return new EquipmentCommandResponse(CEGWCommandResultCode.Success, "Closed session to " + command.getInventoryId(), command,
registeredGateway == null ? null : registeredGateway.getHostname(), registeredGateway == null ? -1 : registeredGateway.getPort());
}
private EquipmentCommandResponse sendClientBlocklistChangeNotification(OvsdbSession session,
CEGWClientBlocklistChangeNotification command) {
private EquipmentCommandResponse sendClientBlocklistChangeNotification(OvsdbSession session, CEGWClientBlocklistChangeNotification command) {
return sendMessage(session, command.getInventoryId(), command);
}
@@ -297,6 +300,10 @@ public class OpensyncCloudGatewayController {
return sendMessage(session, command.getInventoryId(), command);
}
private EquipmentCommandResponse sendCellSizeRequest(OvsdbSession session, CEGWCellSizeAttributesRequest command) {
return sendMessage(session, command.getInventoryId(), command);
}
/**
* Deliver a message in payload to the CE
*
@@ -308,15 +315,17 @@ public class OpensyncCloudGatewayController {
private EquipmentCommandResponse sendMessage(OvsdbSession session, String inventoryId, EquipmentCommand command) {
LOG.debug("Received command {} for {}", command.getCommandType(), inventoryId);
EquipmentCommandResponse response = new EquipmentCommandResponse(CEGWCommandResultCode.Success,
"Received Command " + command.getCommandType() + " for " + inventoryId, command,
registeredGateway.getHostname(), registeredGateway.getPort());
EquipmentCommandResponse response =
new EquipmentCommandResponse(CEGWCommandResultCode.Success, "Received Command " + command.getCommandType() + " for " + inventoryId, command,
registeredGateway == null ? null : registeredGateway.getHostname(), registeredGateway == null ? -1 : registeredGateway.getPort());
if (command instanceof CEGWConfigChangeNotification) {
if (command instanceof CEGWBlinkRequest) {
String resultDetails = tipwlanOvsdbClient.processBlinkRequest(inventoryId, ((CEGWBlinkRequest)command).getBlinkAllLEDs());
response.setResultDetail(resultDetails);
} else if (command instanceof CEGWConfigChangeNotification) {
tipwlanOvsdbClient.processConfigChanged(inventoryId);
} else if (command instanceof CEGWClientBlocklistChangeNotification) {
tipwlanOvsdbClient.processClientBlocklistChange(inventoryId,
((CEGWClientBlocklistChangeNotification) command).getBlockList());
tipwlanOvsdbClient.processClientBlocklistChange(inventoryId, ((CEGWClientBlocklistChangeNotification) command).getBlockList());
} else if (command instanceof CEGWChangeRedirectorHost) {
String newRedirectorAddress = ((CEGWChangeRedirectorHost) command).getRedirectorHost();
tipwlanOvsdbClient.changeRedirectorHost(inventoryId, newRedirectorAddress);
@@ -331,7 +340,13 @@ public class OpensyncCloudGatewayController {
Map<RadioType, Integer> newBackupChannels = request.getNewBackupChannels();
Map<RadioType, Integer> newPrimaryChannels = request.getNewPrimaryChannels();
String resultDetails = tipwlanOvsdbClient.processNewChannelsRequest(inventoryId, newBackupChannels,newPrimaryChannels);
String resultDetails = tipwlanOvsdbClient.processNewChannelsRequest(inventoryId, newBackupChannels, newPrimaryChannels);
response.setResultDetail(resultDetails);
} else if (command instanceof CEGWCellSizeAttributesRequest) {
CEGWCellSizeAttributesRequest request = (CEGWCellSizeAttributesRequest) command;
Map<RadioType, CellSizeAttributes> cellSizeAttributeMap = request.getCellSizeAttributesMap();
String resultDetails = tipwlanOvsdbClient.processCellSizeAttributesRequest(inventoryId, cellSizeAttributeMap);
response.setResultDetail(resultDetails);
} else if (command instanceof CEGWFirmwareDownloadRequest) {
@@ -342,8 +357,7 @@ public class OpensyncCloudGatewayController {
String firmwareVersion = dlRequest.getFirmwareVersion();
String username = dlRequest.getUsername();
String resultDetails = tipwlanOvsdbClient.processFirmwareDownload(inventoryId, filepath, firmwareVersion,
username);
String resultDetails = tipwlanOvsdbClient.processFirmwareDownload(inventoryId, filepath, firmwareVersion, username);
response.setResultDetail(resultDetails);
@@ -355,15 +369,15 @@ public class OpensyncCloudGatewayController {
flashRequest.getInventoryId();
flashRequest.getUsername();
String resultDetails = tipwlanOvsdbClient.processFirmwareFlash(flashRequest.getInventoryId(),
flashRequest.getFirmwareVersion(), flashRequest.getUsername());
String resultDetails =
tipwlanOvsdbClient.processFirmwareFlash(flashRequest.getInventoryId(), flashRequest.getFirmwareVersion(), flashRequest.getUsername());
response.setResultDetail(resultDetails);
} else if (command instanceof CEGWRadioResetRequest) {
response = new EquipmentCommandResponse(CEGWCommandResultCode.UnsupportedCommand,
"Received Command " + command.getCommandType() + " for " + inventoryId, command,
registeredGateway.getHostname(), registeredGateway.getPort());
registeredGateway == null ? null : registeredGateway.getHostname(), registeredGateway == null ? -1 : registeredGateway.getPort());
} else if (command instanceof CEGWRebootRequest) {
CEGWRebootRequest rebootRequest = (CEGWRebootRequest) command;
@@ -387,10 +401,9 @@ public class OpensyncCloudGatewayController {
default:
response = new EquipmentCommandResponse(CEGWCommandResultCode.UnsupportedCommand,
"Received Command " + command.getCommandType() + " for " + inventoryId, command,
registeredGateway.getHostname(), registeredGateway.getPort());
registeredGateway == null ? null : registeredGateway.getHostname(), registeredGateway == null ? -1 : registeredGateway.getPort());
}
}
return response;
@@ -408,15 +421,14 @@ public class OpensyncCloudGatewayController {
return sendMessage(session, command.getInventoryId(), command);
}
private EquipmentCommandResponse processBlinkRequest(OvsdbSession session, CEGWBlinkRequest command) {
return sendMessage(session, command.getInventoryId(), command);
}
@RequestMapping(value = "/commandWithUser", method = RequestMethod.POST)
public EquipmentCommandResponse sendCommandWithAuthUser(@RequestBody EquipmentCommand command,
@AuthenticationPrincipal Object requestUser, HttpServletRequest httpServletRequest) {
public EquipmentCommandResponse sendCommandWithAuthUser(@RequestBody EquipmentCommand command, @AuthenticationPrincipal Object requestUser,
HttpServletRequest httpServletRequest) {
// use these properties to get address and port where request has
// arrived
@@ -449,8 +461,7 @@ public class OpensyncCloudGatewayController {
}
if (eqRoutingSvc == null) {
throw new ConfigurationException(
"Unable to register gateway with routing service: routing service interface not initialized");
throw new ConfigurationException("Unable to register gateway with routing service: routing service interface not initialized");
}
cleanupStaleGwRecord();
@@ -466,13 +477,11 @@ public class OpensyncCloudGatewayController {
EquipmentGatewayRecord result = eqRoutingSvc.registerGateway(gwRecord);
registeredGwId = result.getId();
registeredGateway = result;
LOG.info("Successfully registered (name={}, id={}) with Routing Service", result.getHostname(),
registeredGwId);
LOG.info("Successfully registered (name={}, id={}) with Routing Service", result.getHostname(), registeredGwId);
registeredWithRoutingService = true;
} catch (RuntimeException e) {
// failed
LOG.error("Failed to register Customer Equipment Gateway (name={}) with Routing Service : {}",
getGatewayName(), e.getLocalizedMessage());
LOG.error("Failed to register Customer Equipment Gateway (name={}) with Routing Service : {}", getGatewayName(), e.getLocalizedMessage());
}
}
}
@@ -497,8 +506,7 @@ public class OpensyncCloudGatewayController {
eqRoutingSvc.deleteGateway(eqpRec.getId());
} catch (RuntimeException e) {
// failed
LOG.error("Failed to delete Equipment Gateway (name={}) from Routing Service: {}",
eqpRec.getHostname(), e.getLocalizedMessage());
LOG.error("Failed to delete Equipment Gateway (name={}) from Routing Service: {}", eqpRec.getHostname(), e.getLocalizedMessage());
}
} else {
LOG.debug("Gateway {} is reachable.", eqpRec.getHostname());
@@ -509,9 +517,8 @@ public class OpensyncCloudGatewayController {
}
} catch (Exception ex) { // Catching Exception to prevent crashing the
// register thread
LOG.debug("Generic Exception encountered when trying to cleanup "
+ "the stale not-reachable GateWays. Continuing to register the new Gateway." + " Error: {} ",
ex.getMessage());
LOG.debug("Generic Exception encountered when trying to cleanup " + "the stale not-reachable GateWays. Continuing to register the new Gateway."
+ " Error: {} ", ex.getMessage());
}
}
@@ -535,14 +542,13 @@ public class OpensyncCloudGatewayController {
if (registeredWithRoutingService) {
try {
eqRoutingSvc.deleteGateway(registeredGwId);
LOG.info("Deregistered Customer Equipment Gateway (name={},id={}) with Routing Service",
getGatewayName(), registeredGwId);
LOG.info("Deregistered Customer Equipment Gateway (name={},id={}) with Routing Service", getGatewayName(), registeredGwId);
registeredGwId = -1;
registeredGateway = null;
} catch (Exception e) {
// failed
LOG.error("Failed to deregister Customer Equipment Gateway (name={},id={}) with Routing Service: {}",
getGatewayName(), registeredGwId, e.getLocalizedMessage());
LOG.error("Failed to deregister Customer Equipment Gateway (name={},id={}) with Routing Service: {}", getGatewayName(), registeredGwId,
e.getLocalizedMessage());
}
registeredWithRoutingService = false;
}
@@ -560,12 +566,10 @@ public class OpensyncCloudGatewayController {
* @param equipmentId
* @return associationId
*/
public EquipmentRoutingRecord registerCustomerEquipment(String equipmentName, Integer customerId,
Long equipmentId) {
public EquipmentRoutingRecord registerCustomerEquipment(String equipmentName, Integer customerId, Long equipmentId) {
registerWithRoutingService();
if (!registeredWithRoutingService) {
LOG.error("Unable to register customer equipement (name={},id={}): gateway not registered.", equipmentName,
equipmentId);
LOG.error("Unable to register customer equipement (name={},id={}): gateway not registered.", equipmentName, equipmentId);
return null;
}
// Clean up stale records
@@ -577,13 +581,11 @@ public class OpensyncCloudGatewayController {
try {
routingRecord = eqRoutingSvc.create(routingRecord);
LOG.debug("Registered customer equipment (name={},id={}) with route id={}", equipmentName, equipmentId,
routingRecord.getId());
LOG.debug("Registered customer equipment (name={},id={}) with route id={}", equipmentName, equipmentId, routingRecord.getId());
return routingRecord;
} catch (Exception e) {
LOG.error("Failed to register customer equipement (name={},id={}): {}", equipmentName, equipmentId,
e.getLocalizedMessage());
LOG.error("Failed to register customer equipement (name={},id={}): {}", equipmentName, equipmentId, e.getLocalizedMessage());
}
return null;
}
@@ -596,7 +598,7 @@ public class OpensyncCloudGatewayController {
* Gateway does not exist, delete the equipmentRouting entry.
*
* @param equipmentId:
* Equipment's ID
* Equipment's ID
*/
protected void cleanupStaleEqptRoutingRecord(Long equipmentId) {
LOG.debug("In Clean Up stale Equipment Routing record for Equipment ID {}", equipmentId);
@@ -609,20 +611,17 @@ public class OpensyncCloudGatewayController {
if (gwRec != null) {
if (!isGwReachable(gwRec.getIpAddr(), gwRec.getPort())) {
// GW isn't reachable --> invoke unregister
LOG.debug("Gateway {} is not-reachable... Deleting the equipment routing entry",
gwRec.getHostname());
LOG.debug("Gateway {} is not-reachable... Deleting the equipment routing entry", gwRec.getHostname());
deleteUnresponiveGwRoutingRecord(eqRouting.getId(), equipmentId);
} else {
LOG.debug("Gateway {} is reachable.", gwRec.getHostname());
}
} else {
LOG.debug("Gateway with ID {} not found. Deleting the equipment routing entry ",
eqRouting.getGatewayId());
LOG.debug("Gateway with ID {} not found. Deleting the equipment routing entry ", eqRouting.getGatewayId());
deleteUnresponiveGwRoutingRecord(eqRouting.getId(), equipmentId);
}
} catch (DsEntityNotFoundException entityNotFoundException) {
LOG.debug("Gateway ID: {} not found... Deleting the equipment routing entry",
eqRouting.getGatewayId());
LOG.debug("Gateway ID: {} not found... Deleting the equipment routing entry", eqRouting.getGatewayId());
deleteUnresponiveGwRoutingRecord(eqRouting.getId(), equipmentId);
}
}
@@ -631,9 +630,10 @@ public class OpensyncCloudGatewayController {
}
} catch (Exception genericException) { // Catching Exception to prevent
// crashing the register thread
LOG.debug("Generic Exception encountered when trying to cleanup "
+ "the stale routing records for equipment ID: {}. Continuing to register the new RoutingRecord."
+ " Error: {} ", equipmentId, genericException.getMessage());
LOG.debug(
"Generic Exception encountered when trying to cleanup "
+ "the stale routing records for equipment ID: {}. Continuing to register the new RoutingRecord." + " Error: {} ",
equipmentId, genericException.getMessage());
}
}
@@ -642,8 +642,7 @@ public class OpensyncCloudGatewayController {
eqRoutingSvc.delete(routingId);
} catch (RuntimeException e) {
// failed
LOG.error("Failed to delete Equipment routing record (ID={}) from Routing Service: {}", eqptId,
e.getLocalizedMessage());
LOG.error("Failed to delete Equipment routing record (ID={}) from Routing Service: {}", eqptId, e.getLocalizedMessage());
return false;
}
return true;
@@ -651,18 +650,16 @@ public class OpensyncCloudGatewayController {
public void deregisterCustomerEquipment(Long routingId, String equipmentName, Long equipmentId) {
if (!registeredWithRoutingService) {
LOG.error("Unable to deregister customer equipement (name={},id={}): gateway not registered", equipmentName,
equipmentId);
LOG.error("Unable to deregister customer equipement (name={},id={}): gateway not registered", equipmentName, equipmentId);
return;
}
try {
LOG.debug("Deregistering customer equipment (name={},id={}) with route id={}", equipmentName, equipmentId,
routingId);
LOG.debug("Deregistering customer equipment (name={},id={}) with route id={}", equipmentName, equipmentId, routingId);
eqRoutingSvc.delete(routingId);
} catch (Exception e) {
LOG.error("Failed to deregister customer equipement (name={},id={}) with route id={}: {}", equipmentName,
equipmentId, routingId, e.getLocalizedMessage());
LOG.error("Failed to deregister customer equipement (name={},id={}) with route id={}: {}", equipmentName, equipmentId, routingId,
e.getLocalizedMessage());
}
}

View File

@@ -0,0 +1,365 @@
package com.telecominfraproject.wlan.opensync.external.integration.utils;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import com.google.common.base.Objects;
import com.google.protobuf.ByteString;
import com.telecominfraproject.wlan.client.ClientServiceInterface;
import com.telecominfraproject.wlan.client.info.models.ClientInfoDetails;
import com.telecominfraproject.wlan.client.session.models.AssociationState;
import com.telecominfraproject.wlan.client.session.models.ClientDhcpDetails;
import com.telecominfraproject.wlan.client.session.models.ClientSession;
import com.telecominfraproject.wlan.client.session.models.ClientSessionDetails;
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherInterface;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.opensync.util.OvsdbToWlanCloudTypeMappingUtility;
import com.telecominfraproject.wlan.servicemetric.models.ServiceMetric;
import sts.OpensyncStats.AssocType;
import sts.OpensyncStats.DeviceType;
import sts.OpensyncStats.EventReport;
import sts.OpensyncStats.FrameType;
import sts.OpensyncStats.Report;
import sts.OpensyncStats.EventReport.ClientAssocEvent;
import sts.OpensyncStats.EventReport.ClientAuthEvent;
import sts.OpensyncStats.EventReport.ClientDisconnectEvent;
import sts.OpensyncStats.EventReport.ClientIpEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/***
* MqttStatsPublisher will use this class to publish Stats and Events asynchronously.
* We use async to decrease the processing time for the gateway.
*
* Note: @Async only applies on public method and cannot have self-invocation (i.e. cannot
* calling the async method from within the same class)
*/
@Service
public class AsyncPublishService {
private static final Logger LOG = LoggerFactory.getLogger(MqttStatsPublisher.class);
@Autowired
private CloudEventDispatcherInterface cloudEventDispatcherInterface;
@Autowired
private RealtimeEventPublisher realtimeEventPublisher;
@Autowired
private ClientServiceInterface clientServiceInterface;
@Async
public void asyncPublishStats(String apId, List<ServiceMetric> metricRecordList) {
try {
long publishStart = System.nanoTime();
cloudEventDispatcherInterface.publishMetrics(metricRecordList);
long publishStop = System.nanoTime();
if (LOG.isDebugEnabled())
LOG.debug("Elapsed publishing time for metrics records from AP {} is {} milliseconds", apId,
TimeUnit.MILLISECONDS.convert(publishStop - publishStart, TimeUnit.NANOSECONDS));
} catch (Exception e) {
LOG.error("Exception when trying to publishServiceMetrics.", e);
}
}
@Async
public void asyncPublishEvents(Report report, int customerId, long equipmentId, String apId, long locationId) {
try {
long mqttEventsStart = System.nanoTime();
publishEvents(report, customerId, equipmentId, apId, locationId);
long mqttEventsStop = System.nanoTime();
if (LOG.isDebugEnabled())
LOG.debug("Elapsed publishing time for mqtt events from AP {} is {} milliseconds", apId,
TimeUnit.MILLISECONDS.convert(mqttEventsStop - mqttEventsStart, TimeUnit.NANOSECONDS));
} catch (Exception e) {
LOG.error("Exception when trying to publishEvents.", e);
}
}
void publishEvents(Report report, int customerId, long equipmentId, String apId, long locationId) {
realtimeEventPublisher.publishSipCallEvents(customerId, equipmentId, locationId, report.getVideoVoiceReportList());
for (EventReport eventReport : report.getEventReportList()) {
for (sts.OpensyncStats.EventReport.ClientSession apEventClientSession : eventReport.getClientSessionList()) {
LOG.debug("Processing EventReport::ClientSession for AP {}", apId);
// for the following MQTT events, the client/client session is first updated, then the real time event
// is published.
if (apEventClientSession.hasClientAuthEvent()) {
processClientAuthEvent(customerId, equipmentId, locationId, apEventClientSession);
}
if (apEventClientSession.hasClientAssocEvent()) {
processClientAssocEvent(customerId, equipmentId, locationId, apEventClientSession);
}
if (apEventClientSession.hasClientIpEvent()) {
processClientIpEvent(customerId, equipmentId, locationId, apEventClientSession);
}
if (apEventClientSession.hasClientDisconnectEvent()) {
processClientDisconnectEvent(customerId, equipmentId, locationId, apEventClientSession);
}
}
realtimeEventPublisher.publishChannelHopEvents(customerId, equipmentId, locationId, eventReport);
}
}
private void processClientAuthEvent(int customerId, long equipmentId, long locationId, sts.OpensyncStats.EventReport.ClientSession apEventClientSession) {
ClientAuthEvent apClientEvent = apEventClientSession.getClientAuthEvent();
com.telecominfraproject.wlan.client.models.Client client = clientServiceInterface.getOrNull(customerId, MacAddress.valueOf(apClientEvent.getStaMac()));
if (client == null) {
client = new com.telecominfraproject.wlan.client.models.Client();
client.setCustomerId(customerId);
client.setMacAddress(MacAddress.valueOf(apClientEvent.getStaMac()));
client.setDetails(new ClientInfoDetails());
client = clientServiceInterface.create(client);
}
ClientSession clientSession = clientServiceInterface.getSessionOrNull(customerId, equipmentId, MacAddress.valueOf(apClientEvent.getStaMac()));
if (clientSession == null) {
clientSession = new ClientSession();
clientSession.setCustomerId(customerId);
clientSession.setEquipmentId(equipmentId);
clientSession.setMacAddress(MacAddress.valueOf(apClientEvent.getStaMac()));
clientSession.setLocationId(locationId);
clientSession.setDetails(new ClientSessionDetails());
clientSession.getDetails().setDhcpDetails(new ClientDhcpDetails(Long.toUnsignedString(apEventClientSession.getSessionId())));
}
if (clientSession.getDetails().getPriorEquipmentId() == null) {
clientSession.getDetails().setPriorEquipmentId(clientSession.getEquipmentId());
}
if (clientSession.getDetails().getPriorSessionId() == null) {
if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId())))
clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
}
if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId()))) {
clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
}
clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
clientSession.getDetails().setSsid(apClientEvent.getSsid());
if (apClientEvent.hasAuthStatus()) {
clientSession.getDetails().setAssociationStatus(apClientEvent.getAuthStatus());
}
clientSession.getDetails().setAuthTimestamp(apClientEvent.getTimestampMs());
clientSession.getDetails().setAssociationState(AssociationState._802_11_Authenticated);
clientSession.getDetails().setLastEventTimestamp(apClientEvent.getTimestampMs());
clientSession = clientServiceInterface.updateSession(clientSession);
realtimeEventPublisher.publishClientAuthSystemEvent(customerId, equipmentId, locationId, apEventClientSession.getClientAuthEvent());
}
private void processClientAssocEvent(int customerId, long equipmentId, long locationId,
sts.OpensyncStats.EventReport.ClientSession apEventClientSession) {
ClientAssocEvent apClientEvent = apEventClientSession.getClientAssocEvent();
com.telecominfraproject.wlan.client.models.Client client = clientServiceInterface.getOrNull(customerId, MacAddress.valueOf(apClientEvent.getStaMac()));
if (client == null) {
client = new com.telecominfraproject.wlan.client.models.Client();
client.setCustomerId(customerId);
client.setMacAddress(MacAddress.valueOf(apClientEvent.getStaMac()));
client.setDetails(new ClientInfoDetails());
client = clientServiceInterface.create(client);
}
ClientSession clientSession = clientServiceInterface.getSessionOrNull(customerId, equipmentId, MacAddress.valueOf(apClientEvent.getStaMac()));
if (clientSession == null) {
clientSession = new ClientSession();
clientSession.setCustomerId(customerId);
clientSession.setEquipmentId(equipmentId);
clientSession.setMacAddress(MacAddress.valueOf(apClientEvent.getStaMac()));
clientSession.setLocationId(locationId);
clientSession.setDetails(new ClientSessionDetails());
clientSession.getDetails().setDhcpDetails(new ClientDhcpDetails(Long.toUnsignedString(apEventClientSession.getSessionId())));
}
if (clientSession.getDetails().getPriorEquipmentId() == null) {
clientSession.getDetails().setPriorEquipmentId(clientSession.getEquipmentId());
}
if (clientSession.getDetails().getPriorSessionId() == null) {
if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId())))
clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
}
if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId()))) {
clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
}
clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
clientSession.getDetails().setSsid(apClientEvent.getSsid());
if (apClientEvent.hasStatus()) {
clientSession.getDetails().setAssociationStatus(apClientEvent.getStatus());
}
clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
if (apClientEvent.hasUsing11K()) {
clientSession.getDetails().setIs11KUsed(apClientEvent.getUsing11K());
}
if (apClientEvent.hasUsing11R()) {
clientSession.getDetails().setIs11RUsed(apClientEvent.getUsing11R());
}
if (apClientEvent.hasUsing11V()) {
clientSession.getDetails().setIs11VUsed(apClientEvent.getUsing11V());
}
if (apClientEvent.hasAssocType()) {
clientSession.getDetails().setIsReassociation(apClientEvent.getAssocType().equals(AssocType.REASSOC));
}
if (apClientEvent.hasRssi()) {
clientSession.getDetails().setAssocRssi(apClientEvent.getRssi());
}
if (apClientEvent.hasInternalSc()) {
clientSession.getDetails().setAssocInternalSC(apClientEvent.getInternalSc());
}
clientSession.getDetails().setAssocTimestamp(apClientEvent.getTimestampMs());
clientSession.getDetails().setAssociationState(AssociationState._802_11_Associated);
clientSession.getDetails().setLastEventTimestamp(apClientEvent.getTimestampMs());
clientSession = clientServiceInterface.updateSession(clientSession);
realtimeEventPublisher.publishClientAssocEvent(customerId, equipmentId, locationId, apEventClientSession.getClientAssocEvent());
}
private void processClientIpEvent(int customerId, long equipmentId, long locationId, sts.OpensyncStats.EventReport.ClientSession apEventClientSession) {
ClientIpEvent apClientEvent = apEventClientSession.getClientIpEvent();
com.telecominfraproject.wlan.client.models.Client client = clientServiceInterface.getOrNull(customerId, MacAddress.valueOf(apClientEvent.getStaMac()));
if (client == null) {
client = new com.telecominfraproject.wlan.client.models.Client();
client.setCustomerId(customerId);
client.setMacAddress(MacAddress.valueOf(apClientEvent.getStaMac()));
client.setDetails(new ClientInfoDetails());
client = clientServiceInterface.create(client);
}
client = clientServiceInterface.update(client);
ClientSession clientSession = clientServiceInterface.getSessionOrNull(customerId, equipmentId, MacAddress.valueOf(apClientEvent.getStaMac()));
if (clientSession == null) {
clientSession = new ClientSession();
clientSession.setCustomerId(customerId);
clientSession.setEquipmentId(equipmentId);
clientSession.setMacAddress(MacAddress.valueOf(apClientEvent.getStaMac()));
clientSession.setLocationId(locationId);
clientSession.setDetails(new ClientSessionDetails());
clientSession.getDetails().setDhcpDetails(new ClientDhcpDetails(Long.toUnsignedString(apEventClientSession.getSessionId())));
}
if (clientSession.getDetails().getPriorEquipmentId() == null) {
clientSession.getDetails().setPriorEquipmentId(clientSession.getEquipmentId());
}
if (clientSession.getDetails().getPriorSessionId() == null) {
if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId())))
clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
}
if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId()))) {
clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
}
clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
if (apClientEvent.hasIpAddr()) {
ByteString ipAddress = apClientEvent.getIpAddr();
if (ipAddress != null) {
try {
InetAddress inetAddress = InetAddress.getByAddress(ipAddress.toByteArray());
if (inetAddress instanceof Inet4Address) {
clientSession.getDetails().setIpAddress(inetAddress);
} else if (inetAddress instanceof Inet6Address) {
clientSession.getDetails().setIpAddress(inetAddress);
} else {
LOG.error("Invalid IP Address {}", ipAddress);
}
clientSession.getDetails().setIpTimestamp(apClientEvent.getTimestampMs());
} catch (UnknownHostException ex) {
}
}
}
clientSession.getDetails().setLastEventTimestamp(apClientEvent.getTimestampMs());
clientSession = clientServiceInterface.updateSession(clientSession);
realtimeEventPublisher.publishClientIpEvent(customerId, equipmentId, locationId, apEventClientSession.getClientIpEvent());
}
private void processClientDisconnectEvent(int customerId, long equipmentId, long locationId,
sts.OpensyncStats.EventReport.ClientSession apEventClientSession) {
ClientDisconnectEvent apClientEvent = apEventClientSession.getClientDisconnectEvent();
com.telecominfraproject.wlan.client.models.Client client = clientServiceInterface.getOrNull(customerId, MacAddress.valueOf(apClientEvent.getStaMac()));
if (client == null) {
client = new com.telecominfraproject.wlan.client.models.Client();
client.setCustomerId(customerId);
client.setMacAddress(MacAddress.valueOf(apClientEvent.getStaMac()));
client.setDetails(new ClientInfoDetails());
client = clientServiceInterface.create(client);
}
ClientSession clientSession = clientServiceInterface.getSessionOrNull(customerId, equipmentId, MacAddress.valueOf(apClientEvent.getStaMac()));
if (clientSession == null) {
clientSession = new ClientSession();
clientSession.setCustomerId(customerId);
clientSession.setEquipmentId(equipmentId);
clientSession.setMacAddress(MacAddress.valueOf(apClientEvent.getStaMac()));
clientSession.setLocationId(locationId);
clientSession.setDetails(new ClientSessionDetails());
clientSession.getDetails().setDhcpDetails(new ClientDhcpDetails(Long.toUnsignedString(apEventClientSession.getSessionId())));
}
if (clientSession.getDetails().getPriorSessionId() == null) {
if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId())))
clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
}
if (!Objects.equal(clientSession.getDetails().getSessionId(), Long.toUnsignedString(apEventClientSession.getSessionId()))) {
clientSession.getDetails().setPriorSessionId(clientSession.getDetails().getSessionId());
}
clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
clientSession.getDetails().setSsid(apClientEvent.getSsid());
if (apClientEvent.hasDevType()) {
if (apClientEvent.getDevType().equals(DeviceType.DEV_AP)) {
clientSession.getDetails().setDisconnectByApTimestamp(apClientEvent.getTimestampMs());
if (apClientEvent.hasInternalRc()) {
clientSession.getDetails().setDisconnectByApInternalReasonCode(apClientEvent.getInternalRc());
}
if (apClientEvent.hasReason()) {
clientSession.getDetails().setDisconnectByApReasonCode(apClientEvent.getReason());
}
} else {
clientSession.getDetails().setDisconnectByClientTimestamp(apClientEvent.getTimestampMs());
if (apClientEvent.hasInternalRc()) {
clientSession.getDetails().setDisconnectByClientInternalReasonCode(apClientEvent.getInternalRc());
}
if (apClientEvent.hasReason()) {
clientSession.getDetails().setDisconnectByClientReasonCode(apClientEvent.getReason());
}
}
}
if (apClientEvent.hasFrType()) {
if (apClientEvent.getFrType().equals(FrameType.FT_DEAUTH)) {
}
if (apClientEvent.getFrType().equals(FrameType.FT_DISASSOC)) {
}
}
if (apClientEvent.hasRssi()) {
clientSession.getDetails().setAssocRssi(apClientEvent.getRssi());
}
if (apClientEvent.hasLrcvUpTsInUs()) {
clientSession.getDetails().setLastRxTimestamp(apClientEvent.getLrcvUpTsInUs());
}
if (apClientEvent.hasLsentUpTsInUs()) {
clientSession.getDetails().setLastTxTimestamp(apClientEvent.getLsentUpTsInUs());
}
clientSession.getDetails().setAssociationState(AssociationState.Disconnected);
clientSession.getDetails().setAssocTimestamp(apClientEvent.getTimestampMs());
clientSession.getDetails().setLastEventTimestamp(apClientEvent.getTimestampMs());
clientSession = clientServiceInterface.updateSession(clientSession);
realtimeEventPublisher.publishClientDisconnectEvent(customerId, equipmentId, locationId, apEventClientSession.getClientDisconnectEvent());
}
}

View File

@@ -10,10 +10,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.client.models.events.realtime.ClientConnectSuccessEvent;
import com.telecominfraproject.wlan.client.models.events.realtime.ClientDisconnectEvent.DisconnectFrameType;
import com.telecominfraproject.wlan.client.models.events.realtime.ClientDisconnectEvent.DisconnectInitiator;
import com.telecominfraproject.wlan.client.models.events.realtime.ClientTimeoutEvent.ClientTimeoutReason;
import com.telecominfraproject.wlan.client.models.events.utils.WlanReasonCode;
import com.telecominfraproject.wlan.client.models.events.utils.WlanStatusCode;
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherInterface;
@@ -28,7 +26,6 @@ import com.telecominfraproject.wlan.profile.ProfileServiceInterface;
import com.telecominfraproject.wlan.profile.models.ProfileContainer;
import com.telecominfraproject.wlan.profile.models.ProfileType;
import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
import com.telecominfraproject.wlan.systemevent.equipment.BaseDhcpEvent;
import com.telecominfraproject.wlan.systemevent.equipment.realtime.RealTimeChannelHopEvent;
import com.telecominfraproject.wlan.systemevent.equipment.realtime.RealTimeEventType;
import com.telecominfraproject.wlan.systemevent.equipment.realtime.RealTimeSipCallReportEvent;
@@ -43,7 +40,6 @@ import com.telecominfraproject.wlan.systemevent.models.SystemEvent;
import sts.OpensyncStats;
import sts.OpensyncStats.AssocType;
import sts.OpensyncStats.CTReasonType;
import sts.OpensyncStats.CallReport;
import sts.OpensyncStats.CallStart;
import sts.OpensyncStats.CallStop;
@@ -52,22 +48,8 @@ import sts.OpensyncStats.DeviceType;
import sts.OpensyncStats.EventReport;
import sts.OpensyncStats.EventReport.ClientAssocEvent;
import sts.OpensyncStats.EventReport.ClientAuthEvent;
import sts.OpensyncStats.EventReport.ClientConnectEvent;
import sts.OpensyncStats.EventReport.ClientDisconnectEvent;
import sts.OpensyncStats.EventReport.ClientFailureEvent;
import sts.OpensyncStats.EventReport.ClientFirstDataEvent;
import sts.OpensyncStats.EventReport.ClientIdEvent;
import sts.OpensyncStats.EventReport.ClientIpEvent;
import sts.OpensyncStats.EventReport.ClientTimeoutEvent;
import sts.OpensyncStats.EventReport.DhcpAckEvent;
import sts.OpensyncStats.EventReport.DhcpCommonData;
import sts.OpensyncStats.EventReport.DhcpDeclineEvent;
import sts.OpensyncStats.EventReport.DhcpDiscoverEvent;
import sts.OpensyncStats.EventReport.DhcpInformEvent;
import sts.OpensyncStats.EventReport.DhcpNakEvent;
import sts.OpensyncStats.EventReport.DhcpOfferEvent;
import sts.OpensyncStats.EventReport.DhcpRequestEvent;
import sts.OpensyncStats.EventReport.DhcpTransaction;
import sts.OpensyncStats.FrameType;
import sts.OpensyncStats.RtpFlowStats;
import sts.OpensyncStats.StreamingVideoServerDetected;
@@ -84,12 +66,13 @@ public class RealtimeEventPublisher {
@Autowired
private EquipmentServiceInterface equipmentServiceInterface;
@Autowired
private ProfileServiceInterface profileServiceInterface;
private static final Logger LOG = LoggerFactory.getLogger(RealtimeEventPublisher.class);
void publishChannelHopEvents(int customerId, long equipmentId, long locationId, EventReport e) {
LOG.info("publishChannelHopEvents for customerId {} equipmentId {}");
@@ -178,94 +161,7 @@ public class RealtimeEventPublisher {
}
}
void publishClientConnectSuccessEvent(int customerId, long equipmentId, long locationId, ClientConnectEvent clientConnectEvent) {
LOG.info("Received ClientEvent {} for customerId {} equipmentId {}", clientConnectEvent, customerId,
equipmentId);
ClientConnectSuccessEvent clientEvent = new ClientConnectSuccessEvent(clientConnectEvent.getTimestampMs());
clientEvent.setClientMacAddress(MacAddress.valueOf(clientConnectEvent.getStaMac()));
clientEvent.setRadioType(OvsdbToWlanCloudTypeMappingUtility
.getRadioTypeFromOpensyncStatsRadioBandType(clientConnectEvent.getBand()));
clientEvent.setSsid(clientConnectEvent.getSsid());
clientEvent.setSessionId(clientConnectEvent.getSessionId());
if (clientConnectEvent.hasFbtUsed()) {
clientEvent.setFbtUsed(clientConnectEvent.getFbtUsed());
}
if (clientConnectEvent.hasEvTimeBootupInUsAssoc()) {
clientEvent.setAssocTs(clientConnectEvent.getEvTimeBootupInUsAssoc());
}
if (clientConnectEvent.hasEvTimeBootupInUsAuth()) {
clientEvent.setAuthTs(clientConnectEvent.getEvTimeBootupInUsAuth());
}
if (clientConnectEvent.hasEvTimeBootupInUsEapol()) {
clientEvent.setEapolTs(clientConnectEvent.getEvTimeBootupInUsEapol());
}
if (clientConnectEvent.hasEvTimeBootupInUsFirstRx()) {
clientEvent.setFirstDataRxTs(clientConnectEvent.getEvTimeBootupInUsFirstRx());
}
if (clientConnectEvent.hasEvTimeBootupInUsFirstTx()) {
clientEvent.setFirstDataTxTs(clientConnectEvent.getEvTimeBootupInUsFirstTx());
}
if (clientConnectEvent.hasEvTimeBootupInUsIp()) {
clientEvent.setIpAcquisitionTs(clientConnectEvent.getEvTimeBootupInUsIp());
}
if (clientConnectEvent.hasEvTimeBootupInUsPortEnable()) {
clientEvent.setPortEnabledTs(clientConnectEvent.getEvTimeBootupInUsPortEnable());
}
if (clientConnectEvent.hasCltId()) {
clientEvent.setHostName(clientConnectEvent.getCltId());
}
if (clientConnectEvent.hasSecType()) {
clientEvent.setSecurityType(OvsdbToWlanCloudTypeMappingUtility
.getCloudSecurityTypeFromOpensyncStats(clientConnectEvent.getSecType()));
}
if (clientConnectEvent.hasAssocType()) {
clientEvent.setReassociation(clientConnectEvent.getAssocType().equals(AssocType.REASSOC));
}
if (clientConnectEvent.hasAssocRssi()) {
clientEvent.setAssocRSSI(clientConnectEvent.getAssocRssi());
}
if (clientConnectEvent.hasUsing11K()) {
clientEvent.setUsing11k(clientConnectEvent.getUsing11K());
}
if (clientConnectEvent.hasUsing11R()) {
clientEvent.setUsing11r(clientConnectEvent.getUsing11R());
}
if (clientConnectEvent.hasUsing11V()) {
clientEvent.setUsing11v(clientConnectEvent.getUsing11V());
}
if (clientConnectEvent.hasIpAddr()) {
try {
clientEvent.setIpAddr(InetAddress.getByAddress(clientConnectEvent.getIpAddr().toByteArray()));
} catch (UnknownHostException e1) {
LOG.error("Invalid Ip Address for client {}", clientConnectEvent.getIpAddr(), e1);
}
}
clientEvent.setCustomerId(customerId);
clientEvent.setEquipmentId(equipmentId);
clientEvent.setLocationId(locationId);
LOG.info("publishing client event {} to cloud", clientEvent);
cloudEventDispatcherInterface.publishEvent(clientEvent);
}
void publishClientDisconnectEvent(int customerId, long equipmentId, long locationId, ClientDisconnectEvent clientDisconnectEvent) {
@@ -275,7 +171,7 @@ public class RealtimeEventPublisher {
com.telecominfraproject.wlan.client.models.events.realtime.ClientDisconnectEvent clientEvent = new com.telecominfraproject.wlan.client.models.events.realtime.ClientDisconnectEvent(
clientDisconnectEvent.getTimestampMs());
clientEvent.setClientMacAddress(MacAddress.valueOf(clientDisconnectEvent.getStaMac()));
clientEvent.setSessionId(clientDisconnectEvent.getSessionId());
clientEvent.setSessionId(Long.toUnsignedString( clientDisconnectEvent.getSessionId()));
clientEvent.setRadioType(OvsdbToWlanCloudTypeMappingUtility
.getRadioTypeFromOpensyncStatsRadioBandType(clientDisconnectEvent.getBand()));
clientEvent.setSsid(clientDisconnectEvent.getSsid());
@@ -307,7 +203,7 @@ public class RealtimeEventPublisher {
if (clientDisconnectEvent.hasRssi()) {
clientEvent.setRssi(clientDisconnectEvent.getRssi());
}
clientEvent.setEventTimestamp(clientDisconnectEvent.getTimestampMs());
clientEvent.setCustomerId(customerId);
clientEvent.setEquipmentId(equipmentId);
clientEvent.setLocationId(locationId);
@@ -316,13 +212,13 @@ public class RealtimeEventPublisher {
cloudEventDispatcherInterface.publishEvent(clientEvent);
}
void publishClientAuthSystemEvent(int customerId, long equipmentId, long locationId, ClientAuthEvent clientAuthEvent) {
LOG.info("Received ClientEvent {} for customerId {} equipmentId {}", clientAuthEvent, customerId, equipmentId);
com.telecominfraproject.wlan.client.models.events.realtime.ClientAuthEvent clientEvent = new com.telecominfraproject.wlan.client.models.events.realtime.ClientAuthEvent(
clientAuthEvent.getTimestampMs());
clientEvent.setSessionId(clientAuthEvent.getSessionId());
clientEvent.setSessionId(Long.toUnsignedString( clientAuthEvent.getSessionId()));
clientEvent.setSsid(clientAuthEvent.getSsid());
clientEvent.setClientMacAddress(MacAddress.valueOf(clientAuthEvent.getStaMac()));
clientEvent.setRadioType(OvsdbToWlanCloudTypeMappingUtility
@@ -331,6 +227,7 @@ public class RealtimeEventPublisher {
if (clientAuthEvent.hasAuthStatus()) {
clientEvent.setAuthStatus(WlanStatusCode.getById(clientAuthEvent.getAuthStatus()));
}
clientEvent.setEventTimestamp(clientAuthEvent.getTimestampMs());
clientEvent.setCustomerId(customerId);
clientEvent.setEquipmentId(equipmentId);
clientEvent.setLocationId(locationId);
@@ -339,14 +236,14 @@ public class RealtimeEventPublisher {
cloudEventDispatcherInterface.publishEvent(clientEvent);
}
void publishClientAssocEvent(int customerId, long equipmentId, long locationId, ClientAssocEvent clientAssocEvent) {
LOG.info("Received ClientEvent {} for customerId {} equipmentId {}", clientAssocEvent, customerId, equipmentId);
com.telecominfraproject.wlan.client.models.events.realtime.ClientAssocEvent clientEvent = new com.telecominfraproject.wlan.client.models.events.realtime.ClientAssocEvent(
clientAssocEvent.getTimestampMs());
clientEvent.setSessionId(clientAssocEvent.getSessionId());
clientEvent.setSessionId(Long.toUnsignedString( clientAssocEvent.getSessionId()));
clientEvent.setSsid(clientAssocEvent.getSsid());
clientEvent.setClientMacAddress(MacAddress.valueOf(clientAssocEvent.getStaMac()));
clientEvent.setRadioType(OvsdbToWlanCloudTypeMappingUtility
@@ -380,6 +277,7 @@ public class RealtimeEventPublisher {
clientEvent.setUsing11v(clientAssocEvent.getUsing11V());
}
clientEvent.setEventTimestamp(clientAssocEvent.getTimestampMs());
clientEvent.setCustomerId(customerId);
clientEvent.setEquipmentId(equipmentId);
clientEvent.setLocationId(locationId);
@@ -388,82 +286,7 @@ public class RealtimeEventPublisher {
cloudEventDispatcherInterface.publishEvent(clientEvent);
}
void publishClientFailureEvent(int customerId, long equipmentId, long locationId, ClientFailureEvent clientFailureEvent) {
LOG.info("Received ClientEvent {} for customerId {} equipmentId {}", clientFailureEvent, customerId,
equipmentId);
com.telecominfraproject.wlan.client.models.events.realtime.ClientFailureEvent clientEvent = new com.telecominfraproject.wlan.client.models.events.realtime.ClientFailureEvent(
clientFailureEvent.getTimestampMs());
clientEvent.setSessionId(clientFailureEvent.getSessionId());
clientEvent.setClientMacAddress(MacAddress.valueOf(clientFailureEvent.getStaMac()));
clientEvent.setSsid(clientFailureEvent.getSsid());
if (clientFailureEvent.hasReasonStr()) {
clientEvent.setReasonString(clientFailureEvent.getReasonStr());
}
if (clientFailureEvent.hasReasonCode()) {
clientEvent.setReasonCode(WlanReasonCode.getById(clientFailureEvent.getReasonCode()));
}
clientEvent.setCustomerId(customerId);
clientEvent.setEquipmentId(equipmentId);
clientEvent.setLocationId(locationId);
LOG.info("publishing client event {} to cloud", clientEvent);
cloudEventDispatcherInterface.publishEvent(clientEvent);
}
void publishClientFirstDataEvent(int customerId, long equipmentId, long locationId, ClientFirstDataEvent clientFirstDataEvent) {
LOG.info("Received ClientEvent {} for customerId {} equipmentId {}", clientFirstDataEvent, customerId,
equipmentId);
com.telecominfraproject.wlan.client.models.events.realtime.ClientFirstDataEvent clientEvent = new com.telecominfraproject.wlan.client.models.events.realtime.ClientFirstDataEvent(
clientFirstDataEvent.getTimestampMs());
clientEvent.setSessionId(clientFirstDataEvent.getSessionId());
clientEvent.setClientMacAddress(MacAddress.valueOf(clientFirstDataEvent.getStaMac()));
if (clientFirstDataEvent.hasFdataTxUpTsInUs()) {
clientEvent.setFirstDataSentTs(clientFirstDataEvent.getFdataTxUpTsInUs());
}
if (clientFirstDataEvent.hasFdataRxUpTsInUs()) {
clientEvent.setFirstDataRcvdTs(clientFirstDataEvent.getFdataRxUpTsInUs());
}
clientEvent.setCustomerId(customerId);
clientEvent.setEquipmentId(equipmentId);
clientEvent.setLocationId(locationId);
LOG.info("publishing client event {} to cloud", clientEvent);
cloudEventDispatcherInterface.publishEvent(clientEvent);
}
void publishClientIdEvent(int customerId, long equipmentId, long locationId, ClientIdEvent clientIdEvent) {
LOG.info("Received ClientEvent {} for customerId {} equipmentId {}", clientIdEvent, customerId, equipmentId);
com.telecominfraproject.wlan.client.models.events.realtime.ClientIdEvent clientEvent = new com.telecominfraproject.wlan.client.models.events.realtime.ClientIdEvent(
clientIdEvent.getTimestampMs());
clientEvent.setSessionId(clientIdEvent.getSessionId());
clientEvent.setClientMacAddress(MacAddress.valueOf(clientIdEvent.getCltMac()));
if (clientIdEvent.hasCltId()) {
clientEvent.setUserId(clientIdEvent.getCltId());
}
clientEvent.setCustomerId(customerId);
clientEvent.setEquipmentId(equipmentId);
clientEvent.setLocationId(locationId);
LOG.info("publishing client event {} to cloud", clientEvent);
cloudEventDispatcherInterface.publishEvent(clientEvent);
}
void publishClientIpEvent(int customerId, long equipmentId, long locationId, ClientIpEvent clientIpEvent) {
LOG.info("Received ClientEvent {} for customerId {} equipmentId {}", clientIpEvent, customerId, equipmentId);
@@ -471,12 +294,17 @@ public class RealtimeEventPublisher {
com.telecominfraproject.wlan.client.models.events.realtime.ClientIpAddressEvent clientEvent = new com.telecominfraproject.wlan.client.models.events.realtime.ClientIpAddressEvent(
clientIpEvent.getTimestampMs());
clientEvent.setSessionId(clientIpEvent.getSessionId());
clientEvent.setSessionId(Long.toUnsignedString( clientIpEvent.getSessionId()));
clientEvent.setClientMacAddress(MacAddress.valueOf(clientIpEvent.getStaMac()));
if (clientIpEvent.hasIpAddr()) {
clientEvent.setIpAddr(clientIpEvent.getIpAddr().toByteArray());
try {
clientEvent.setIpAddr(InetAddress.getByAddress(clientIpEvent.getIpAddr().toByteArray()));
} catch (UnknownHostException e1) {
LOG.error("Invalid Client IP Address for equipmentId {}, clientIpEvent {}", equipmentId, clientIpEvent);
}
}
clientEvent.setEventTimestamp(clientIpEvent.getTimestampMs());
clientEvent.setCustomerId(customerId);
clientEvent.setEquipmentId(equipmentId);
clientEvent.setLocationId(locationId);
@@ -484,318 +312,7 @@ public class RealtimeEventPublisher {
LOG.info("publishing client event {} to cloud", clientEvent);
cloudEventDispatcherInterface.publishEvent(clientEvent);
}
void publishClientTimeoutEvent(int customerId, long equipmentId, long locationId, ClientTimeoutEvent clientTimeoutEvent) {
LOG.info("Received ClientEvent {} for customerId {} equipmentId {}", clientTimeoutEvent, customerId,
equipmentId);
com.telecominfraproject.wlan.client.models.events.realtime.ClientTimeoutEvent clientEvent = new com.telecominfraproject.wlan.client.models.events.realtime.ClientTimeoutEvent(
clientTimeoutEvent.getTimestampMs());
clientEvent.setSessionId(clientTimeoutEvent.getSessionId());
clientEvent.setClientMacAddress(MacAddress.valueOf(clientTimeoutEvent.getStaMac()));
if (clientTimeoutEvent.hasRCode()) {
clientEvent.setTimeoutReason(clientTimeoutEvent.getRCode().equals(CTReasonType.CTR_IDLE_TOO_LONG)
? ClientTimeoutReason.IdleTooLong
: ClientTimeoutReason.FailedProbe);
}
if (clientTimeoutEvent.hasLastRcvUpTsInUs()) {
clientEvent.setLastRecvTime(clientTimeoutEvent.getLastRcvUpTsInUs());
}
if (clientTimeoutEvent.hasLastSentUpTsInUs()) {
clientEvent.setLastSentTime(clientTimeoutEvent.getLastSentUpTsInUs());
}
clientEvent.setCustomerId(customerId);
clientEvent.setEquipmentId(equipmentId);
clientEvent.setLocationId(locationId);
LOG.info("publishing client event {} to cloud", clientEvent);
cloudEventDispatcherInterface.publishEvent(clientEvent);
}
void publishDhcpTransactionEvents(int customerId, long equipmentId, long locationId, List<DhcpTransaction> dhcpTransactionList) {
LOG.info("Publish Dhcp Transaction Events for customer {} equipmentId {}", customerId, equipmentId);
List<SystemEvent> dhcpEventsList = new ArrayList<>();
for (DhcpTransaction dhcpTransaction : dhcpTransactionList) {
for (DhcpAckEvent ackEvent : dhcpTransaction.getDhcpAckEventList()) {
LOG.debug("DhcpAckEvent {}", ackEvent);
com.telecominfraproject.wlan.systemevent.equipment.DhcpAckEvent cloudDhcpAck = new com.telecominfraproject.wlan.systemevent.equipment.DhcpAckEvent();
cloudDhcpAck.setCustomerId(customerId);
cloudDhcpAck.setEquipmentId(equipmentId);
cloudDhcpAck.setLocationId(locationId);
if (ackEvent.hasDhcpCommonData()) {
cloudDhcpAck = (com.telecominfraproject.wlan.systemevent.equipment.DhcpAckEvent) getDhcpCommonDataForEvent(
cloudDhcpAck, ackEvent.getDhcpCommonData());
} else {
cloudDhcpAck.setxId(dhcpTransaction.getXId());
}
if (ackEvent.hasGatewayIp()) {
try {
cloudDhcpAck.setGatewayIp(InetAddress.getByAddress(ackEvent.getGatewayIp().toByteArray()));
} catch (UnknownHostException e) {
LOG.error("Invalid GatewayIP", e);
}
}
if (ackEvent.hasLeaseTime()) {
cloudDhcpAck.setLeaseTime(ackEvent.getLeaseTime());
}
if (ackEvent.hasPrimaryDns()) {
try {
cloudDhcpAck.setPrimaryDns(InetAddress.getByAddress(ackEvent.getPrimaryDns().toByteArray()));
} catch (UnknownHostException e) {
LOG.error("Invalid PrimaryDNS", e);
}
}
if (ackEvent.hasSecondaryDns()) {
try {
cloudDhcpAck
.setSecondaryDns(InetAddress.getByAddress(ackEvent.getSecondaryDns().toByteArray()));
} catch (UnknownHostException e) {
LOG.error("Invalid SecondaryDNS", e);
}
}
if (ackEvent.hasRebindingTime()) {
cloudDhcpAck.setRebindingTime(ackEvent.getRebindingTime());
}
if (ackEvent.hasRenewalTime()) {
cloudDhcpAck.setRenewalTime(ackEvent.getRenewalTime());
}
if (ackEvent.hasSubnetMask()) {
try {
cloudDhcpAck.setSubnetMask(InetAddress.getByAddress(ackEvent.getSubnetMask().toByteArray()));
} catch (UnknownHostException e) {
LOG.error("Invalid SubnetMask", e);
}
}
if (ackEvent.hasTimeOffset()) {
cloudDhcpAck.setTimeOffset(ackEvent.getTimeOffset());
}
LOG.debug("Cloud DhcpAckEvent {}", cloudDhcpAck);
dhcpEventsList.add(cloudDhcpAck);
}
for (DhcpNakEvent nakEvent : dhcpTransaction.getDhcpNakEventList()) {
LOG.debug("DhcpNakEvent {}", nakEvent);
com.telecominfraproject.wlan.systemevent.equipment.DhcpNakEvent cloudDhcpNak = new com.telecominfraproject.wlan.systemevent.equipment.DhcpNakEvent();
cloudDhcpNak.setCustomerId(customerId);
cloudDhcpNak.setEquipmentId(equipmentId);
cloudDhcpNak.setLocationId(locationId);
if (nakEvent.hasDhcpCommonData()) {
cloudDhcpNak = (com.telecominfraproject.wlan.systemevent.equipment.DhcpNakEvent) getDhcpCommonDataForEvent(
cloudDhcpNak, nakEvent.getDhcpCommonData());
} else {
cloudDhcpNak.setxId(dhcpTransaction.getXId());
}
if (nakEvent.hasFromInternal()) {
cloudDhcpNak.setFromInternal(nakEvent.getFromInternal());
}
LOG.debug("Cloud DhcpNakEvent {}", cloudDhcpNak);
dhcpEventsList.add(cloudDhcpNak);
}
for (DhcpOfferEvent offerEvent : dhcpTransaction.getDhcpOfferEventList()) {
LOG.debug("DhcpOfferEvent {}", offerEvent);
com.telecominfraproject.wlan.systemevent.equipment.DhcpOfferEvent cloudDhcpOffer = new com.telecominfraproject.wlan.systemevent.equipment.DhcpOfferEvent();
cloudDhcpOffer.setCustomerId(customerId);
cloudDhcpOffer.setEquipmentId(equipmentId);
cloudDhcpOffer.setLocationId(locationId);
if (offerEvent.hasDhcpCommonData()) {
cloudDhcpOffer = (com.telecominfraproject.wlan.systemevent.equipment.DhcpOfferEvent) getDhcpCommonDataForEvent(
cloudDhcpOffer, offerEvent.getDhcpCommonData());
} else {
cloudDhcpOffer.setxId(dhcpTransaction.getXId());
}
if (offerEvent.hasFromInternal()) {
cloudDhcpOffer.setFromInternal(offerEvent.getFromInternal());
}
dhcpEventsList.add(cloudDhcpOffer);
}
for (DhcpInformEvent informEvent : dhcpTransaction.getDhcpInformEventList()) {
LOG.debug("DhcpInformEvent {}", informEvent);
com.telecominfraproject.wlan.systemevent.equipment.DhcpInformEvent cloudDhcpInform = new com.telecominfraproject.wlan.systemevent.equipment.DhcpInformEvent();
cloudDhcpInform.setCustomerId(customerId);
cloudDhcpInform.setEquipmentId(equipmentId);
cloudDhcpInform.setLocationId(locationId);
if (informEvent.hasDhcpCommonData()) {
cloudDhcpInform = (com.telecominfraproject.wlan.systemevent.equipment.DhcpInformEvent) getDhcpCommonDataForEvent(
cloudDhcpInform, informEvent.getDhcpCommonData());
} else {
cloudDhcpInform.setxId(dhcpTransaction.getXId());
}
dhcpEventsList.add(cloudDhcpInform);
}
for (DhcpDeclineEvent declineEvent : dhcpTransaction.getDhcpDeclineEventList()) {
LOG.debug("DhcpDeclineEvent {}", declineEvent);
com.telecominfraproject.wlan.systemevent.equipment.DhcpDeclineEvent cloudDhcpDecline = new com.telecominfraproject.wlan.systemevent.equipment.DhcpDeclineEvent();
cloudDhcpDecline.setCustomerId(customerId);
cloudDhcpDecline.setEquipmentId(equipmentId);
cloudDhcpDecline.setLocationId(locationId);
if (declineEvent.hasDhcpCommonData()) {
cloudDhcpDecline = (com.telecominfraproject.wlan.systemevent.equipment.DhcpDeclineEvent) getDhcpCommonDataForEvent(
cloudDhcpDecline, declineEvent.getDhcpCommonData());
} else {
cloudDhcpDecline.setxId(dhcpTransaction.getXId());
}
LOG.debug("Cloud DhcpDeclineEvent {}", cloudDhcpDecline);
dhcpEventsList.add(cloudDhcpDecline);
}
for (DhcpRequestEvent requestEvent : dhcpTransaction.getDhcpRequestEventList()) {
LOG.debug("DhcpRequestEvent {}", requestEvent);
com.telecominfraproject.wlan.systemevent.equipment.DhcpRequestEvent cloudDhcpRequest = new com.telecominfraproject.wlan.systemevent.equipment.DhcpRequestEvent();
cloudDhcpRequest.setCustomerId(customerId);
cloudDhcpRequest.setEquipmentId(equipmentId);
cloudDhcpRequest.setLocationId(locationId);
if (requestEvent.hasDhcpCommonData()) {
cloudDhcpRequest = (com.telecominfraproject.wlan.systemevent.equipment.DhcpRequestEvent) getDhcpCommonDataForEvent(
cloudDhcpRequest, requestEvent.getDhcpCommonData());
} else {
cloudDhcpRequest.setxId(dhcpTransaction.getXId());
}
if (requestEvent.hasHostname()) {
cloudDhcpRequest.setHostName(requestEvent.getHostname());
}
LOG.debug("Cloud DhcpRequestEvent {}", cloudDhcpRequest);
dhcpEventsList.add(cloudDhcpRequest);
}
for (DhcpDiscoverEvent discoverEvent : dhcpTransaction.getDhcpDiscoverEventList()) {
LOG.debug("DhcpDiscoverEvent {}", discoverEvent);
com.telecominfraproject.wlan.systemevent.equipment.DhcpDiscoverEvent cloudDhcpDiscover = new com.telecominfraproject.wlan.systemevent.equipment.DhcpDiscoverEvent();
cloudDhcpDiscover.setCustomerId(customerId);
cloudDhcpDiscover.setEquipmentId(equipmentId);
cloudDhcpDiscover.setLocationId(locationId);
if (discoverEvent.hasDhcpCommonData()) {
cloudDhcpDiscover = (com.telecominfraproject.wlan.systemevent.equipment.DhcpDiscoverEvent) getDhcpCommonDataForEvent(
cloudDhcpDiscover, discoverEvent.getDhcpCommonData());
} else {
cloudDhcpDiscover.setxId(dhcpTransaction.getXId());
}
if (discoverEvent.hasHostname()) {
cloudDhcpDiscover.setHostName(discoverEvent.getHostname());
}
LOG.debug("Cloud DhcpDiscoverEvent {}", cloudDhcpDiscover);
dhcpEventsList.add(cloudDhcpDiscover);
}
}
if (dhcpEventsList.size() > 0) {
LOG.info("Publishing DhcpEvents {}", dhcpEventsList);
cloudEventDispatcherInterface.publishEventsBulk(dhcpEventsList);
}
}
BaseDhcpEvent getDhcpCommonDataForEvent(BaseDhcpEvent cloudDhcpEvent, DhcpCommonData dhcpCommonData) {
if (dhcpCommonData.hasXId()) {
cloudDhcpEvent.setxId(dhcpCommonData.getXId());
}
if (dhcpCommonData.hasVlanId()) {
cloudDhcpEvent.setVlanId(dhcpCommonData.getVlanId());
}
if (dhcpCommonData.hasDeviceMacAddress()) {
try {
cloudDhcpEvent.setClientMacAddress(MacAddress.valueOf(dhcpCommonData.getDeviceMacAddress()));
} catch (Exception e) {
LOG.error("Could not parse device_mac_address from DhcpCommonData ", dhcpCommonData, e);
}
}
if (dhcpCommonData.hasDhcpServerIp()) {
try {
cloudDhcpEvent
.setDhcpServerIp(InetAddress.getByAddress(dhcpCommonData.getDhcpServerIp().toByteArray()));
} catch (UnknownHostException e) {
LOG.error("Invalid Dhcp Server IP", e);
}
}
if (dhcpCommonData.hasClientIp()) {
try {
cloudDhcpEvent.setClientIp(InetAddress.getByAddress(dhcpCommonData.getClientIp().toByteArray()));
} catch (UnknownHostException e) {
LOG.error("Invalid Client IP", e);
}
}
if (dhcpCommonData.hasRelayIp()) {
try {
cloudDhcpEvent.setRelayIp(InetAddress.getByAddress(dhcpCommonData.getRelayIp().toByteArray()));
} catch (UnknownHostException e) {
LOG.error("Invalid Relay IP", e);
}
}
cloudDhcpEvent.setEventTimestamp(dhcpCommonData.getTimestampMs());
return cloudDhcpEvent;
}
void publishSipCallEvents(int customerId, long equipmentId, long locationId, List<VideoVoiceReport> sipCallReportList) {
// only in case it is not there, we will just use the time when we
// received the report/event
@@ -847,7 +364,7 @@ public class RealtimeEventPublisher {
cloudSipCallReportEvent.setEventType(RealTimeEventType.SipCallReport);
cloudSipCallReportEvent.setSipCallId(callReport.getWifiSessionId());
cloudSipCallReportEvent.setAssociationId(callReport.getSessionId());
cloudSipCallReportEvent.setAssociationId(Long.toUnsignedString( callReport.getSessionId()));
if (callReport.hasReason()) {
cloudSipCallReportEvent.setReportReason(getCallReportReason(callReport.getReason()));
@@ -913,11 +430,11 @@ public class RealtimeEventPublisher {
}
if (apCallStart.hasSessionId()) {
cloudSipCallStartEvent.setAssociationId(apCallStart.getSessionId());
cloudSipCallStartEvent.setAssociationId(Long.toUnsignedString( apCallStart.getSessionId()));
}
if (apCallStart.hasWifiSessionId()) {
cloudSipCallStartEvent.setAssociationId(apCallStart.getWifiSessionId());
cloudSipCallStartEvent.setAssociationId(Long.toUnsignedString( apCallStart.getWifiSessionId()));
}
if (apCallStart.getCodecsCount() > 0) {
@@ -977,7 +494,7 @@ public class RealtimeEventPublisher {
if (apCallStop.hasSessionId()) {
cloudSipCallStopEvent.setAssociationId(apCallStop.getSessionId());
cloudSipCallStopEvent.setAssociationId(Long.toUnsignedString( apCallStop.getSessionId()));
}
@@ -1041,11 +558,11 @@ public class RealtimeEventPublisher {
}
if (apStreamVideoServer.hasSessionId()) {
rtsStartEvent.setSessionId(apStreamVideoServer.getSessionId());
rtsStartEvent.setSessionId(Long.toUnsignedString( apStreamVideoServer.getSessionId()));
}
if (apStreamVideoServer.hasVideoSessionId()) {
rtsStartEvent.setVideoSessionId(apStreamVideoServer.getVideoSessionId());
rtsStartEvent.setVideoSessionId(Long.toUnsignedString( apStreamVideoServer.getVideoSessionId()));
}
eventsList.add(rtsStartEvent);
@@ -1165,7 +682,7 @@ public class RealtimeEventPublisher {
}
if (apStreamVideoSessionStart.hasSessionId()) {
rtsStartSessionEvent.setSessionId(apStreamVideoSessionStart.getSessionId());
rtsStartSessionEvent.setSessionId(Long.toUnsignedString( apStreamVideoSessionStart.getSessionId()));
}
@@ -1176,7 +693,7 @@ public class RealtimeEventPublisher {
}
if (apStreamVideoSessionStart.hasVideoSessionId()) {
rtsStartSessionEvent.setVideoSessionId(apStreamVideoSessionStart.getVideoSessionId());
rtsStartSessionEvent.setVideoSessionId(Long.toUnsignedString( apStreamVideoSessionStart.getVideoSessionId()));
}
eventsList.add(rtsStartSessionEvent);
}
@@ -1206,7 +723,7 @@ public class RealtimeEventPublisher {
}
if (apStreamVideoStop.hasSessionId()) {
rtsStopEvent.setSessionId(apStreamVideoStop.getSessionId());
rtsStopEvent.setSessionId(Long.toUnsignedString( apStreamVideoStop.getSessionId()));
}
if (apStreamVideoStop.hasStreamingVideoType()) {
@@ -1221,7 +738,7 @@ public class RealtimeEventPublisher {
}
if (apStreamVideoStop.hasVideoSessionId()) {
rtsStopEvent.setVideoSessionId(apStreamVideoStop.getVideoSessionId());
rtsStopEvent.setVideoSessionId(Long.toUnsignedString( apStreamVideoStop.getVideoSessionId()));
}
eventsList.add(rtsStopEvent);

View File

@@ -1,3 +1,4 @@
package com.telecominfraproject.wlan.opensync.external.integration;
import static org.junit.Assert.assertNotNull;
@@ -5,6 +6,7 @@ import static org.junit.Assert.assertNull;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -48,6 +50,7 @@ import com.telecominfraproject.wlan.core.model.entity.CountryCode;
import com.telecominfraproject.wlan.core.model.equipment.EquipmentType;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.core.model.pagination.PaginationResponse;
import com.telecominfraproject.wlan.customer.models.Customer;
import com.telecominfraproject.wlan.customer.models.CustomerDetails;
import com.telecominfraproject.wlan.customer.models.EquipmentAutoProvisioningSettings;
@@ -64,6 +67,7 @@ import com.telecominfraproject.wlan.location.models.LocationType;
import com.telecominfraproject.wlan.location.service.LocationServiceInterface;
import com.telecominfraproject.wlan.opensync.external.integration.controller.OpensyncCloudGatewayController;
import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPInetState;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPRadioState;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPVIFState;
import com.telecominfraproject.wlan.opensync.external.integration.utils.MqttStatsPublisher;
@@ -75,11 +79,13 @@ import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
import com.telecominfraproject.wlan.routing.RoutingServiceInterface;
import com.telecominfraproject.wlan.status.StatusServiceInterface;
import com.telecominfraproject.wlan.status.equipment.models.EquipmentChannelStatusData;
import com.telecominfraproject.wlan.status.equipment.models.EquipmentProtocolStatusData;
import com.telecominfraproject.wlan.status.equipment.models.EquipmentUpgradeStatusData;
import com.telecominfraproject.wlan.status.equipment.report.models.ActiveBSSID;
import com.telecominfraproject.wlan.status.equipment.report.models.ActiveBSSIDs;
import com.telecominfraproject.wlan.status.equipment.report.models.ClientConnectionDetails;
import com.telecominfraproject.wlan.status.equipment.report.models.WiredPortStatus;
import com.telecominfraproject.wlan.status.models.Status;
import com.telecominfraproject.wlan.status.models.StatusDataType;
import com.vmware.ovsdb.protocol.operation.notation.Uuid;
@@ -88,15 +94,13 @@ import sts.OpensyncStats.AssocType;
import sts.OpensyncStats.Client;
import sts.OpensyncStats.ClientReport;
import sts.OpensyncStats.EventReport;
import sts.OpensyncStats.EventReport.ClientAssocEvent;
import sts.OpensyncStats.RadioBandType;
import sts.OpensyncStats.Report;
@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = { "integration_test", })
@ActiveProfiles(profiles = {"integration_test",})
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = OpensyncExternalIntegrationCloudTest.class)
@Import(value = { AlarmServiceInterface.class, OpensyncExternalIntegrationCloud.class,
OpensyncExternalIntegrationCloudTest.Config.class,
@Import(value = {AlarmServiceInterface.class, OpensyncExternalIntegrationCloud.class, OpensyncExternalIntegrationCloudTest.Config.class,
})
public class OpensyncExternalIntegrationCloudTest {
@@ -131,7 +135,6 @@ public class OpensyncExternalIntegrationCloudTest {
@Autowired
OpensyncExternalIntegrationCloud opensyncExternalIntegrationCloud;
MockitoSession mockito;
@Configuration
@@ -168,10 +171,12 @@ public class OpensyncExternalIntegrationCloudTest {
Location location = new Location();
location.setId(8L);
location.setCustomerId(2);
location.setDetails(LocationDetails.createWithDefaults());
LocationDetails details = LocationDetails.createWithDefaults();
details.setCountryCode(CountryCode.CA);
location.setDetails(details);
location.setName("Location-UT");
location.setLocationType(LocationType.BUILDING);
Mockito.when(locationServiceInterface.getOrNull(Mockito.anyLong())).thenReturn(location);
Customer customer = new Customer();
customer.setId(2);
CustomerDetails customerDetails = new CustomerDetails();
@@ -190,25 +195,21 @@ public class OpensyncExternalIntegrationCloudTest {
ssidProfile.setDetails(SsidConfiguration.createWithDefaults());
apProfile.setChildProfileIds(ImmutableSet.of(ssidProfile.getId()));
Mockito.when(profileServiceInterface.create(ArgumentMatchers.any(Profile.class)))
.thenAnswer(i -> i.getArguments()[0]);
Mockito.when(profileServiceInterface.create(ArgumentMatchers.any(Profile.class))).thenAnswer(i -> i.getArguments()[0]);
// .thenReturn(ssidProfile);
Mockito.when(profileServiceInterface.update(ArgumentMatchers.any(Profile.class)))
.thenAnswer(i -> i.getArguments()[0]);
Mockito.when(profileServiceInterface.update(ArgumentMatchers.any(Profile.class))).thenAnswer(i -> i.getArguments()[0]);
Status fwStatus = new Status();
fwStatus.setDetails(new EquipmentUpgradeStatusData());
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(),
ArgumentMatchers.eq(StatusDataType.FIRMWARE))).thenReturn(fwStatus);
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(), ArgumentMatchers.eq(StatusDataType.FIRMWARE)))
.thenReturn(fwStatus);
Mockito.when(firmwareServiceInterface.getDefaultCustomerTrackSetting())
.thenReturn(new CustomerFirmwareTrackSettings());
Mockito.when(firmwareServiceInterface.getDefaultCustomerTrackSetting()).thenReturn(new CustomerFirmwareTrackSettings());
CustomerFirmwareTrackRecord fwTrackRecord = new CustomerFirmwareTrackRecord();
fwTrackRecord.setSettings(new CustomerFirmwareTrackSettings());
fwTrackRecord.setTrackRecordId(3);
fwTrackRecord.setCustomerId(2);
Mockito.when(firmwareServiceInterface.getCustomerFirmwareTrackRecord(ArgumentMatchers.anyInt()))
.thenReturn(fwTrackRecord);
Mockito.when(firmwareServiceInterface.getCustomerFirmwareTrackRecord(ArgumentMatchers.anyInt())).thenReturn(fwTrackRecord);
Equipment equipment = new Equipment();
equipment.setCustomerId(2);
@@ -220,24 +221,18 @@ public class OpensyncExternalIntegrationCloudTest {
equipment.setDetails(ApElementConfiguration.createWithDefaults());
Mockito.when(equipmentServiceInterface.get(1L)).thenReturn(equipment);
Mockito.when(
equipmentServiceInterface.getByInventoryIdOrNull(ArgumentMatchers.eq("Test_Client_21P10C68818122")))
.thenReturn(equipment);
Mockito.when(equipmentServiceInterface.getByInventoryIdOrNull(ArgumentMatchers.eq("Test_Client_21P10C68818122"))).thenReturn(equipment);
Mockito.when(equipmentServiceInterface.create(ArgumentMatchers.any(Equipment.class)))
.thenAnswer(i -> i.getArguments()[0]);
Mockito.when(equipmentServiceInterface.update(ArgumentMatchers.any(Equipment.class)))
.thenAnswer(i -> i.getArguments()[0]);
Mockito.when(equipmentServiceInterface.create(ArgumentMatchers.any(Equipment.class))).thenAnswer(i -> i.getArguments()[0]);
Mockito.when(equipmentServiceInterface.update(ArgumentMatchers.any(Equipment.class))).thenAnswer(i -> i.getArguments()[0]);
OvsdbSession session = Mockito.mock(OvsdbSession.class);
Mockito.when(ovsdbSessionMapInterface.getSession("Test_Client_21P10C68818122")).thenReturn(session);
opensyncExternalIntegrationCloud.apConnected("Test_Client_21P10C68818122", createConnectNodeInfo());
Mockito.verify(firmwareServiceInterface).getDefaultCustomerTrackSetting();
Mockito.verifyNoInteractions(locationServiceInterface);
Mockito.verify(locationServiceInterface).getOrNull(ArgumentMatchers.anyLong());
}
@@ -246,11 +241,12 @@ public class OpensyncExternalIntegrationCloudTest {
Location location = new Location();
location.setId(8L);
location.setCustomerId(2);
location.setDetails(LocationDetails.createWithDefaults());
LocationDetails details = LocationDetails.createWithDefaults();
details.setCountryCode(CountryCode.CA);
location.setDetails(details);
location.setName("Location-UT");
location.setLocationType(LocationType.BUILDING);
Mockito.when(locationServiceInterface.get(8L)).thenReturn(location);
Mockito.when(locationServiceInterface.getOrNull(8L)).thenReturn(location);
Customer customer = new Customer();
customer.setId(2);
@@ -262,7 +258,7 @@ public class OpensyncExternalIntegrationCloudTest {
customer.setDetails(customerDetails);
Mockito.when(customerServiceInterface.getOrNull(ArgumentMatchers.anyInt())).thenReturn(customer);
Profile rfProfile = new Profile();
rfProfile.setId(1);
rfProfile.setName("testRfProfile");
@@ -277,21 +273,20 @@ public class OpensyncExternalIntegrationCloudTest {
Profile ssidProfile = new Profile();
ssidProfile.setId(2);
ssidProfile.setDetails(SsidConfiguration.createWithDefaults());
Set<Long> childProfileIds = new HashSet<>();
childProfileIds.add(rfProfile.getId());
childProfileIds.add(ssidProfile.getId());
childProfileIds.add(rfProfile.getId());
childProfileIds.add(ssidProfile.getId());
apProfile.setChildProfileIds(childProfileIds);
Mockito.when(profileServiceInterface.create(ArgumentMatchers.any(Profile.class))).thenReturn(apProfile)
.thenReturn(ssidProfile).thenReturn(rfProfile);
Mockito.when(profileServiceInterface.create(ArgumentMatchers.any(Profile.class))).thenReturn(apProfile).thenReturn(ssidProfile).thenReturn(rfProfile);
Mockito.when(profileServiceInterface.update(ArgumentMatchers.any(Profile.class))).thenReturn(apProfile);
List<Profile> profileList = new ArrayList<>();
profileList.add(apProfile);
profileList.add(rfProfile);
profileList.add(ssidProfile);
Mockito.when(profileServiceInterface.getProfileWithChildren(ArgumentMatchers.anyLong())).thenReturn(profileList);
Equipment equipment = new Equipment();
@@ -305,27 +300,21 @@ public class OpensyncExternalIntegrationCloudTest {
Mockito.when(equipmentServiceInterface.get(1L)).thenReturn(equipment);
Mockito.when(equipmentServiceInterface.create(ArgumentMatchers.any(Equipment.class)))
.thenAnswer(i -> i.getArguments()[0]);
Mockito.when(equipmentServiceInterface.update(ArgumentMatchers.any(Equipment.class)))
.thenAnswer(i -> i.getArguments()[0]);
Mockito.when(
equipmentServiceInterface.getByInventoryIdOrNull(ArgumentMatchers.eq("Test_Client_21P10C68818122")))
.thenReturn(null);
Mockito.when(equipmentServiceInterface.create(ArgumentMatchers.any(Equipment.class))).thenAnswer(i -> i.getArguments()[0]);
Mockito.when(equipmentServiceInterface.update(ArgumentMatchers.any(Equipment.class))).thenAnswer(i -> i.getArguments()[0]);
Mockito.when(equipmentServiceInterface.getByInventoryIdOrNull(ArgumentMatchers.eq("Test_Client_21P10C68818122"))).thenReturn(null);
Status fwStatus = new Status();
fwStatus.setDetails(new EquipmentUpgradeStatusData());
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(),
ArgumentMatchers.eq(StatusDataType.FIRMWARE))).thenReturn(fwStatus);
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(), ArgumentMatchers.eq(StatusDataType.FIRMWARE)))
.thenReturn(fwStatus);
Mockito.when(firmwareServiceInterface.getDefaultCustomerTrackSetting())
.thenReturn(new CustomerFirmwareTrackSettings());
Mockito.when(firmwareServiceInterface.getDefaultCustomerTrackSetting()).thenReturn(new CustomerFirmwareTrackSettings());
CustomerFirmwareTrackRecord fwTrackRecord = new CustomerFirmwareTrackRecord();
fwTrackRecord.setSettings(new CustomerFirmwareTrackSettings());
fwTrackRecord.setTrackRecordId(3);
fwTrackRecord.setCustomerId(2);
Mockito.when(firmwareServiceInterface.getCustomerFirmwareTrackRecord(ArgumentMatchers.anyInt()))
.thenReturn(fwTrackRecord);
Mockito.when(firmwareServiceInterface.getCustomerFirmwareTrackRecord(ArgumentMatchers.anyInt())).thenReturn(fwTrackRecord);
OvsdbSession session = Mockito.mock(OvsdbSession.class);
@@ -337,7 +326,7 @@ public class OpensyncExternalIntegrationCloudTest {
Mockito.verify(customerServiceInterface).getOrNull(ArgumentMatchers.anyInt());
Mockito.verify(equipmentServiceInterface).getByInventoryIdOrNull("Test_Client_21P10C68818122");
Mockito.verify(firmwareServiceInterface).getDefaultCustomerTrackSetting();
Mockito.verify(locationServiceInterface).get(ArgumentMatchers.anyLong());
Mockito.verify(locationServiceInterface, Mockito.times(2)).getOrNull(ArgumentMatchers.anyLong());
}
@@ -350,18 +339,19 @@ public class OpensyncExternalIntegrationCloudTest {
ssidProfile.setDetails(SsidConfiguration.createWithDefaults());
apProfile.setChildProfileIds(ImmutableSet.of(ssidProfile.getId()));
Mockito.when(profileServiceInterface.create(ArgumentMatchers.any(Profile.class)))
.thenAnswer(i -> i.getArguments()[0]);
Mockito.when(profileServiceInterface.create(ArgumentMatchers.any(Profile.class))).thenAnswer(i -> i.getArguments()[0]);
// .thenReturn(ssidProfile);
Mockito.when(profileServiceInterface.update(ArgumentMatchers.any(Profile.class)))
.thenAnswer(i -> i.getArguments()[0]);
Mockito.when(profileServiceInterface.update(ArgumentMatchers.any(Profile.class))).thenAnswer(i -> i.getArguments()[0]);
Location location = new Location();
location.setId(8L);
location.setCustomerId(2);
location.setDetails(LocationDetails.createWithDefaults());
LocationDetails details = LocationDetails.createWithDefaults();
details.setCountryCode(CountryCode.CA);
location.setDetails(details);
location.setName("Location-UT");
location.setLocationType(LocationType.BUILDING);
Mockito.when(locationServiceInterface.get(8L)).thenReturn(location);
Equipment equipment = new Equipment();
equipment.setCustomerId(2);
@@ -373,26 +363,20 @@ public class OpensyncExternalIntegrationCloudTest {
equipment.setDetails(ApElementConfiguration.createWithDefaults());
Status fwStatus = new Status();
fwStatus.setDetails(new EquipmentUpgradeStatusData());
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(),
ArgumentMatchers.eq(StatusDataType.FIRMWARE))).thenReturn(fwStatus);
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(), ArgumentMatchers.eq(StatusDataType.FIRMWARE)))
.thenReturn(fwStatus);
Mockito.when(firmwareServiceInterface.getDefaultCustomerTrackSetting())
.thenReturn(new CustomerFirmwareTrackSettings());
Mockito.when(firmwareServiceInterface.getDefaultCustomerTrackSetting()).thenReturn(new CustomerFirmwareTrackSettings());
CustomerFirmwareTrackRecord fwTrackRecord = new CustomerFirmwareTrackRecord();
fwTrackRecord.setSettings(new CustomerFirmwareTrackSettings());
fwTrackRecord.setTrackRecordId(3);
fwTrackRecord.setCustomerId(2);
Mockito.when(firmwareServiceInterface.getCustomerFirmwareTrackRecord(ArgumentMatchers.anyInt()))
.thenReturn(fwTrackRecord);
Mockito.when(firmwareServiceInterface.getCustomerFirmwareTrackRecord(ArgumentMatchers.anyInt())).thenReturn(fwTrackRecord);
Mockito.when(equipmentServiceInterface.get(1L)).thenReturn(equipment);
Mockito.when(equipmentServiceInterface.create(ArgumentMatchers.any(Equipment.class)))
.thenAnswer(i -> i.getArguments()[0]);
Mockito.when(equipmentServiceInterface.update(ArgumentMatchers.any(Equipment.class)))
.thenAnswer(i -> i.getArguments()[0]);
Mockito.when(
equipmentServiceInterface.getByInventoryIdOrNull(ArgumentMatchers.eq("Test_Client_21P10C68818122")))
.thenReturn(equipment);
Mockito.when(equipmentServiceInterface.create(ArgumentMatchers.any(Equipment.class))).thenAnswer(i -> i.getArguments()[0]);
Mockito.when(equipmentServiceInterface.update(ArgumentMatchers.any(Equipment.class))).thenAnswer(i -> i.getArguments()[0]);
Mockito.when(equipmentServiceInterface.getByInventoryIdOrNull(ArgumentMatchers.eq("Test_Client_21P10C68818122"))).thenReturn(equipment);
Customer customer = new Customer();
customer.setId(2);
@@ -438,8 +422,7 @@ public class OpensyncExternalIntegrationCloudTest {
ssidProfile.setDetails(SsidConfiguration.createWithDefaults());
List<Profile> profileWithChildren = ImmutableList.of(apProfile, ssidProfile);
Mockito.when(profileServiceInterface.getProfileWithChildren(ArgumentMatchers.anyLong()))
.thenReturn(profileWithChildren);
Mockito.when(profileServiceInterface.getProfileWithChildren(ArgumentMatchers.anyLong())).thenReturn(profileWithChildren);
assertNotNull(opensyncExternalIntegrationCloud.getApConfig("Test_Client_21P10C68818122"));
@@ -465,8 +448,7 @@ public class OpensyncExternalIntegrationCloudTest {
@Test
public void testProcessMqttMessageStringReport() {
Report report = Report.newBuilder().setNodeID("21P10C68818122")
.addAllClients(getOpensyncStatsClientReportsList())
Report report = Report.newBuilder().setNodeID("21P10C68818122").addAllClients(getOpensyncStatsClientReportsList())
.addAllEventReport(getOpensyncStatsEventReportsList()).build();
String topic = "/ap/Test_Client_21P10C68818122/opensync";
@@ -479,8 +461,8 @@ public class OpensyncExternalIntegrationCloudTest {
activeBssidsDetails.setActiveBSSIDs(getActiveBssidList());
bssidStatus.setDetails(activeBssidsDetails);
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(),
ArgumentMatchers.eq(StatusDataType.ACTIVE_BSSIDS))).thenReturn(bssidStatus);
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(), ArgumentMatchers.eq(StatusDataType.ACTIVE_BSSIDS)))
.thenReturn(bssidStatus);
Mockito.when(statusServiceInterface.update(ArgumentMatchers.any(Status.class))).thenReturn(bssidStatus);
com.telecominfraproject.wlan.client.models.Client clientInstance = new com.telecominfraproject.wlan.client.models.Client();
@@ -489,12 +471,10 @@ public class OpensyncExternalIntegrationCloudTest {
com.telecominfraproject.wlan.client.models.Client clientInstance2 = new com.telecominfraproject.wlan.client.models.Client();
clientInstance2.setMacAddress(MacAddress.valueOf("C0:9A:D0:76:A9:69"));
clientInstance2.setDetails(new ClientInfoDetails());
Mockito.when(
clientServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.any(MacAddress.class)))
.thenReturn(clientInstance).thenReturn(clientInstance2);
Mockito.when(clientServiceInterface
.update(ArgumentMatchers.any(com.telecominfraproject.wlan.client.models.Client.class)))
.thenReturn(clientInstance).thenReturn(clientInstance2);
Mockito.when(clientServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.any(MacAddress.class))).thenReturn(clientInstance)
.thenReturn(clientInstance2);
Mockito.when(clientServiceInterface.update(ArgumentMatchers.any(com.telecominfraproject.wlan.client.models.Client.class))).thenReturn(clientInstance)
.thenReturn(clientInstance2);
ClientSession clientSession = new ClientSession();
clientSession.setMacAddress(MacAddress.valueOf("7C:AB:60:E6:EA:4D"));
@@ -502,16 +482,10 @@ public class OpensyncExternalIntegrationCloudTest {
ClientSession clientSession2 = new ClientSession();
clientSession2.setMacAddress(MacAddress.valueOf("C0:9A:D0:76:A9:69"));
clientSession2.setDetails(new ClientSessionDetails());
Mockito.when(clientServiceInterface.getSessionOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(),
ArgumentMatchers.any(MacAddress.class))).thenReturn(clientSession).thenReturn(clientSession2);
Mockito.when(clientServiceInterface.updateSession(ArgumentMatchers.any(ClientSession.class)))
Mockito.when(clientServiceInterface.getSessionOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(), ArgumentMatchers.any(MacAddress.class)))
.thenReturn(clientSession).thenReturn(clientSession2);
opensyncExternalIntegrationCloud.processMqttMessage(topic, report);
Mockito.verify(opensyncExternalIntegrationMqttProcessor, Mockito.times(1)).processMqttMessage(topic, report);
Mockito.when(clientServiceInterface.updateSession(ArgumentMatchers.any(ClientSession.class))).thenReturn(clientSession).thenReturn(clientSession2);
}
@Ignore
@@ -579,10 +553,10 @@ public class OpensyncExternalIntegrationCloudTest {
OvsdbSession session = Mockito.mock(OvsdbSession.class);
Mockito.when(session.getEquipmentId()).thenReturn(1L);
Mockito.when(session.getCustomerId()).thenReturn(2);
Equipment equipment = new Equipment();
equipment.setCustomerId(1);
equipment.setCustomerId(2);
equipment.setId(1L);
equipment.setEquipmentType(EquipmentType.AP);
equipment.setInventoryId(apId);
equipment.setProfileId(1);
@@ -591,7 +565,7 @@ public class OpensyncExternalIntegrationCloudTest {
Mockito.when(equipmentServiceInterface.getOrNull(1L)).thenReturn(equipment);
Mockito.when(equipmentServiceInterface.get(equipment.getId())).thenReturn(equipment);
Mockito.when(equipmentServiceInterface.update(equipment)).thenReturn(equipment);
Profile rfProfile = new Profile();
rfProfile.setName("testRfProfile");
rfProfile.setId(2);
@@ -599,30 +573,28 @@ public class OpensyncExternalIntegrationCloudTest {
rfProfile.setProfileType(ProfileType.rf);
Set<Long> childProfileIds = new HashSet<>();
childProfileIds.add(rfProfile.getId());
Profile apProfile = new Profile();
apProfile.setName("testApProfile");
apProfile.setId(1);
apProfile.setProfileType(ProfileType.equipment_ap);
apProfile.setChildProfileIds(childProfileIds);
List<Profile> profileList = new ArrayList<>();
profileList.add(apProfile);
profileList.add(rfProfile);
Mockito.when(profileServiceInterface.getProfileWithChildren(ArgumentMatchers.anyLong())).thenReturn(profileList);
Mockito.when(ovsdbSessionMapInterface.getSession(apId)).thenReturn(session);
opensyncExternalIntegrationCloud.wifiVIFStateDbTableUpdate(ImmutableList.of(vifState1, vifState2, vifState3),
apId);
opensyncExternalIntegrationCloud.wifiVIFStateDbTableUpdate(ImmutableList.of(vifState1, vifState2, vifState3), apId);
Mockito.verify(session).getCustomerId();
Mockito.verify(session).getEquipmentId();
Mockito.verify(ovsdbSessionMapInterface).getSession(apId);
Mockito.verify(equipmentServiceInterface).getOrNull(1L);
Mockito.verify(statusServiceInterface).getOrNull(2, 1L, StatusDataType.CLIENT_DETAILS);
Mockito.verify(statusServiceInterface).getOrNull(2, 1L, StatusDataType.ACTIVE_BSSIDS);
Mockito.verify(statusServiceInterface).update(clientStatus);
@@ -654,8 +626,7 @@ public class OpensyncExternalIntegrationCloudTest {
radioState3.setChannel(149);
radioState3.setVifStates(ImmutableSet.of(new Uuid(UUID.randomUUID())));
radioState3.setFreqBand(RadioType.is5GHzL);
radioState3.setAllowedChannels(
ImmutableSet.of(00, 104, 108, 112, 116, 132, 136, 140, 144, 149, 153, 157, 161, 165));
radioState3.setAllowedChannels(ImmutableSet.of(00, 104, 108, 112, 116, 132, 136, 140, 144, 149, 153, 157, 161, 165));
radioState3.setTxPower(32);
radioState3.setEnabled(true);
radioState3.setCountry("CA");
@@ -679,6 +650,18 @@ public class OpensyncExternalIntegrationCloudTest {
Mockito.when(statusServiceInterface.getOrNull(2, 1L, StatusDataType.PROTOCOL)).thenReturn(protocolStatus);
Status channelStatus = new Status();
channelStatus.setCustomerId(2);
channelStatus.setEquipmentId(1L);
EquipmentChannelStatusData channelStatusData = 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);
channelStatusData.setChannelNumberStatusDataMap(channelStatusDataMap);
channelStatus.setDetails(channelStatusData);
Mockito.when(statusServiceInterface.getOrNull(2, 1L, StatusDataType.RADIO_CHANNEL)).thenReturn(channelStatus);
Status bssidStatus = new Status();
bssidStatus.setStatusDataType(StatusDataType.ACTIVE_BSSIDS);
bssidStatus.setCustomerId(2);
@@ -689,8 +672,6 @@ public class OpensyncExternalIntegrationCloudTest {
Mockito.when(statusServiceInterface.getOrNull(2, 1L, StatusDataType.ACTIVE_BSSIDS)).thenReturn(bssidStatus);
Mockito.when(statusServiceInterface.update(bssidStatus)).thenReturn(bssidStatus);
Status clientStatus = new Status();
clientStatus.setCustomerId(2);
clientStatus.setEquipmentId(1L);
@@ -702,27 +683,45 @@ public class OpensyncExternalIntegrationCloudTest {
clientStatus.setDetails(clientConnectionDetails);
Mockito.when(statusServiceInterface.getOrNull(2, 1L, StatusDataType.CLIENT_DETAILS)).thenReturn(clientStatus);
Mockito.when(statusServiceInterface.update(clientStatus)).thenReturn(clientStatus);
Mockito.when(statusServiceInterface.update(Mockito.any(Status.class))).thenReturn(channelStatus).thenReturn(bssidStatus).thenReturn(clientStatus);
OvsdbSession session = Mockito.mock(OvsdbSession.class);
Mockito.when(session.getEquipmentId()).thenReturn(1L);
Mockito.when(session.getCustomerId()).thenReturn(2);
Mockito.when(ovsdbSessionMapInterface.getSession(apId)).thenReturn(session);
opensyncExternalIntegrationCloud
.wifiRadioStatusDbTableUpdate(ImmutableList.of(radioState1, radioState2, radioState3), apId);
opensyncExternalIntegrationCloud.wifiRadioStatusDbTableUpdate(ImmutableList.of(radioState1, radioState2, radioState3), apId);
Mockito.verify(session).getCustomerId();
Mockito.verify(session).getEquipmentId();
Mockito.verify(ovsdbSessionMapInterface).getSession(apId);
Mockito.verify(equipmentServiceInterface, Mockito.times(1)).getByInventoryIdOrNull(apId);
Mockito.verify(statusServiceInterface, Mockito.times(1)).getOrNull(1, 1L, StatusDataType.RADIO_CHANNEL);
Mockito.verify(statusServiceInterface, Mockito.times(3)).getOrNull(2, 1L, StatusDataType.PROTOCOL);
Mockito.verify(statusServiceInterface, Mockito.times(3)).getOrNull(1, 1L, StatusDataType.PROTOCOL);
Mockito.verify(statusServiceInterface, Mockito.never()).update(bssidStatus);
}
@Test
public void testParseRawDataToWiredPortStatus() {
Map<String, List<WiredPortStatus>> portStatus = new HashMap<>();
OpensyncAPInetState inetState = new OpensyncAPInetState();
inetState.setIfType("bridge");
@SuppressWarnings("serial")
Map<String, String> ethPorts = new HashMap<String, String>(){{
put("eth0", "up lan 1000Mbps full");
put("eth1", "up wan 1000Mbps full");
put("eth2", "incorrect value");
}};
inetState.setIfName("lan");
inetState.setEthPorts(ethPorts);
opensyncExternalIntegrationCloud.parseRawDataToWiredPortStatus(2, 1, portStatus, inetState);
assertEquals(1, portStatus.size());
assertEquals(true, portStatus.containsKey("lan"));
assertEquals(2, portStatus.get("lan").size());
assertEquals("lan", portStatus.get("lan").get(0).getCurrentIfName());
}
@Ignore
public void testWifiInetStateDbTableUpdate() {
@@ -741,6 +740,23 @@ public class OpensyncExternalIntegrationCloudTest {
@Test
public void testWifiVIFStateDbTableDelete() {
String apId = "Test_Client_21P10C68818122";
Equipment equipment = new Equipment();
equipment.setCustomerId(2);
equipment.setId(1L);
equipment.setEquipmentType(EquipmentType.AP);
equipment.setInventoryId(apId);
equipment.setProfileId(1);
equipment.setDetails(ApElementConfiguration.createWithDefaults());
Mockito.when(equipmentServiceInterface.getByInventoryIdOrNull(apId)).thenReturn(equipment);
Mockito.when(equipmentServiceInterface.getOrNull(1L)).thenReturn(equipment);
OvsdbSession session = new OvsdbSession();
session.setApId(apId);
session.setEquipmentId(1L);
Mockito.when(ovsdbSessionMapInterface.getSession(apId)).thenReturn(session);
Status bssidStatus = new Status();
bssidStatus.setStatusDataType(StatusDataType.ACTIVE_BSSIDS);
@@ -750,16 +766,36 @@ public class OpensyncExternalIntegrationCloudTest {
activeBssidsDetails.setActiveBSSIDs(getActiveBssidList());
bssidStatus.setDetails(activeBssidsDetails);
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(),
ArgumentMatchers.eq(StatusDataType.ACTIVE_BSSIDS))).thenReturn(bssidStatus);
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(), ArgumentMatchers.eq(StatusDataType.ACTIVE_BSSIDS)))
.thenReturn(bssidStatus);
PaginationResponse<ClientSession> pr = Mockito.mock(PaginationResponse.class,Mockito.RETURNS_MOCKS);
Mockito.when(clientServiceInterface.getSessionsForCustomer(Mockito.anyInt(), Mockito.anySet(),
Mockito.anySet(), Mockito.isNull(), Mockito.isNull(), Mockito.any())).thenReturn(pr);
opensyncExternalIntegrationCloud.wifiVIFStateDbTableDelete(ImmutableList.of(new OpensyncAPVIFState()), "apId");
opensyncExternalIntegrationCloud.wifiVIFStateDbTableDelete(ImmutableList.of(new OpensyncAPVIFState()), "Test_Client_21P10C68818122");
}
@Test
public void testWifiAssociatedClientsDbTableDelete() {
String apId = "Test_Client_21P10C68818122";
opensyncExternalIntegrationCloud.wifiAssociatedClientsDbTableDelete("7C:AB:60:E6:EA:4D", "apId");
Equipment equipment = new Equipment();
equipment.setCustomerId(2);
equipment.setId(1L);
equipment.setEquipmentType(EquipmentType.AP);
equipment.setInventoryId(apId);
equipment.setProfileId(1);
equipment.setDetails(ApElementConfiguration.createWithDefaults());
Mockito.when(equipmentServiceInterface.getByInventoryIdOrNull(apId)).thenReturn(equipment);
Mockito.when(equipmentServiceInterface.getOrNull(1L)).thenReturn(equipment);
OvsdbSession session = new OvsdbSession();
session.setApId(apId);
session.setEquipmentId(1L);
Mockito.when(ovsdbSessionMapInterface.getSession(apId)).thenReturn(session);
opensyncExternalIntegrationCloud.wifiAssociatedClientsDbTableDelete("7C:AB:60:E6:EA:4D", "Test_Client_21P10C68818122");
}
// Helper methods
@@ -787,11 +823,9 @@ public class OpensyncExternalIntegrationCloudTest {
return bssidList;
}
private List<EventReport> getOpensyncStatsEventReportsList() {
sts.OpensyncStats.EventReport.ClientAssocEvent.Builder clientAssocBuilder = EventReport.ClientAssocEvent
.getDefaultInstance().toBuilder();
sts.OpensyncStats.EventReport.ClientAssocEvent.Builder clientAssocBuilder = EventReport.ClientAssocEvent.getDefaultInstance().toBuilder();
clientAssocBuilder.setAssocType(AssocType.ASSOC);
clientAssocBuilder.setBand(RadioBandType.BAND5GU);
clientAssocBuilder.setRssi(-65);
@@ -819,29 +853,26 @@ public class OpensyncExternalIntegrationCloudTest {
eventReportList.add(eventReportBuilder.build());
return eventReportList;
}
private List<ClientReport> getOpensyncStatsClientReportsList() {
int rssi = Long.valueOf(4294967239L).intValue();
Client.Stats clientStats = Client.Stats.getDefaultInstance().toBuilder().setRssi(rssi).setRxBytes(225554786)
.setRxRate(24000.0).setTxBytes(1208133026).setTxRate(433300.0).setRssi(758722570).setRxFrames(10000)
.setTxFrames(10000).setTxRate(24000.0).build();
Client client2g = Client.getDefaultInstance().toBuilder().setMacAddress("7C:AB:60:E6:EA:4D").setSsid("ssid-1")
.setConnected(true).setDurationMs(59977).setStats(clientStats).build();
Client client5gu = Client.getDefaultInstance().toBuilder().setMacAddress("C0:9A:D0:76:A9:69").setSsid("ssid-3")
.setConnected(true).setDurationMs(298127).setStats(clientStats).build();
Client.Stats clientStats = Client.Stats.getDefaultInstance().toBuilder().setRssi(rssi).setRxBytes(225554786).setRxRate(24000.0).setTxBytes(1208133026)
.setTxRate(433300.0).setRssi(758722570).setRxFrames(10000).setTxFrames(10000).setTxRate(24000.0).build();
Client client2g = Client.getDefaultInstance().toBuilder().setMacAddress("7C:AB:60:E6:EA:4D").setSsid("ssid-1").setConnected(true).setDurationMs(59977)
.setStats(clientStats).build();
Client client5gu = Client.getDefaultInstance().toBuilder().setMacAddress("C0:9A:D0:76:A9:69").setSsid("ssid-3").setConnected(true).setDurationMs(298127)
.setStats(clientStats).build();
ClientReport clientReport2g = ClientReport.getDefaultInstance().toBuilder().setBand(RadioBandType.BAND2G)
.setChannel(6).addAllClientList(ImmutableList.of(client2g)).build();
ClientReport clientReport5gl = ClientReport.getDefaultInstance().toBuilder().setBand(RadioBandType.BAND5GL)
.setChannel(36).addAllClientList(new ArrayList<Client>()).build();
ClientReport clientReport5gu = ClientReport.getDefaultInstance().toBuilder().setBand(RadioBandType.BAND5GU)
.setChannel(157).addAllClientList(ImmutableList.of(client5gu)).build();
ClientReport clientReport2g =
ClientReport.getDefaultInstance().toBuilder().setBand(RadioBandType.BAND2G).setChannel(6).addAllClientList(ImmutableList.of(client2g)).build();
ClientReport clientReport5gl =
ClientReport.getDefaultInstance().toBuilder().setBand(RadioBandType.BAND5GL).setChannel(36).addAllClientList(new ArrayList<Client>()).build();
ClientReport clientReport5gu = ClientReport.getDefaultInstance().toBuilder().setBand(RadioBandType.BAND5GU).setChannel(157)
.addAllClientList(ImmutableList.of(client5gu)).build();
List<ClientReport> clients = new ArrayList<>();
clients.add(clientReport2g);
@@ -870,8 +901,7 @@ public class OpensyncExternalIntegrationCloudTest {
connectNodeInfo.skuNumber = "connectus.ai_21P10C68818122";
connectNodeInfo.redirectorAddr = "ssl:opensync.zone1.art2wave.com:6643";
connectNodeInfo.platformVersion = "OPENWRT_EA8300";
connectNodeInfo.wifiRadioStates = ImmutableMap.of("2.4G", "home-ap-24", "5GL", "home-ap-l50", "5GU",
"home-ap-u50");
connectNodeInfo.wifiRadioStates = ImmutableMap.of("2.4G", "home-ap-24", "5GL", "home-ap-l50", "5GU", "home-ap-u50");
Map<String, String> versionMatrix = new HashMap<>();
versionMatrix.put("DATE", "Thu Jul 16 18:52:06 UTC 2020");

View File

@@ -1,389 +0,0 @@
package com.telecominfraproject.wlan.opensync.external.integration.utils;
import static org.junit.Assert.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.ArgumentMatchers;
import org.mockito.Mockito;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import com.google.common.collect.ImmutableList;
import com.google.protobuf.ByteString;
import com.telecominfraproject.wlan.alarm.AlarmServiceInterface;
import com.telecominfraproject.wlan.client.ClientServiceInterface;
import com.telecominfraproject.wlan.client.info.models.ClientInfoDetails;
import com.telecominfraproject.wlan.client.session.models.ClientSession;
import com.telecominfraproject.wlan.client.session.models.ClientSessionDetails;
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherInterface;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.customer.service.CustomerServiceInterface;
import com.telecominfraproject.wlan.equipment.EquipmentServiceInterface;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration;
import com.telecominfraproject.wlan.equipment.models.Equipment;
import com.telecominfraproject.wlan.firmware.FirmwareServiceInterface;
import com.telecominfraproject.wlan.location.service.LocationServiceInterface;
import com.telecominfraproject.wlan.opensync.external.integration.OpensyncExternalIntegrationCloud;
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSession;
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSessionMapInterface;
import com.telecominfraproject.wlan.opensync.external.integration.controller.OpensyncCloudGatewayController;
import com.telecominfraproject.wlan.profile.ProfileServiceInterface;
import com.telecominfraproject.wlan.routing.RoutingServiceInterface;
import com.telecominfraproject.wlan.servicemetric.apnode.models.ApNodeMetrics;
import com.telecominfraproject.wlan.servicemetric.apnode.models.StateUpDownError;
import com.telecominfraproject.wlan.status.StatusServiceInterface;
import com.telecominfraproject.wlan.status.equipment.report.models.ActiveBSSID;
import com.telecominfraproject.wlan.status.equipment.report.models.ActiveBSSIDs;
import com.telecominfraproject.wlan.status.models.Status;
import com.telecominfraproject.wlan.status.models.StatusDataType;
import sts.OpensyncStats.AssocType;
import sts.OpensyncStats.ChannelSwitchReason;
import sts.OpensyncStats.Client;
import sts.OpensyncStats.ClientReport;
import sts.OpensyncStats.DNSProbeMetric;
import sts.OpensyncStats.EventReport;
import sts.OpensyncStats.EventReport.ChannelSwitchEvent;
import sts.OpensyncStats.EventReport.ClientAssocEvent;
import sts.OpensyncStats.NetworkProbe;
import sts.OpensyncStats.RADIUSMetrics;
import sts.OpensyncStats.RadioBandType;
import sts.OpensyncStats.Report;
import sts.OpensyncStats.StateUpDown;
import sts.OpensyncStats.VLANMetrics;
@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = { "integration_test", })
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = MqttStatsPublisherTest.class)
@Import(value = { AlarmServiceInterface.class, OpensyncExternalIntegrationCloud.class,
MqttStatsPublisherTest.Config.class,
})
public class MqttStatsPublisherTest {
@MockBean
AlarmServiceInterface alarmServiceInterface;
@MockBean
CustomerServiceInterface customerServiceInterface;
@MockBean
LocationServiceInterface locationServiceInterface;
@MockBean(answer = Answers.RETURNS_MOCKS)
OvsdbSessionMapInterface ovsdbSessionMapInterface;
@MockBean
CloudEventDispatcherInterface equipmentMetricsCollectorInterface;
@MockBean
EquipmentServiceInterface equipmentServiceInterface;
@MockBean
RoutingServiceInterface routingServiceInterface;
@MockBean
ProfileServiceInterface profileServiceInterface;
@MockBean
StatusServiceInterface statusServiceInterface;
@MockBean
ClientServiceInterface clientServiceInterface;
@MockBean
FirmwareServiceInterface firmwareServiceInterface;
@MockBean(answer = Answers.RETURNS_MOCKS)
OpensyncCloudGatewayController gatewayController;
@MockBean
RealtimeEventPublisher realtimeEventPublisher;
@Autowired
MqttStatsPublisher opensyncExternalIntegrationMqttProcessor;
MockitoSession mockito;
@Configuration
static class Config {
@Bean
public MqttStatsPublisher mqttStatsPublisher() {
return new MqttStatsPublisher();
}
}
@Before
public void setUp() throws Exception {
mockito = Mockito.mockitoSession().initMocks(this).strictness(Strictness.STRICT_STUBS).startMocking();
}
@After
public void tearDown() throws Exception {
mockito.finishMocking();
}
@Test
public void testExtractApIdFromTopic() {
String topic = "/ap/Test_Client_21P10C68818122/opensync";
assertEquals("Test_Client_21P10C68818122", MqttStatsPublisher.extractApIdFromTopic(topic));
}
@Test
public void testExtractCustomerIdFromTopic() {
String topic = "/ap/Test_Client_21P10C68818122/opensync";
OvsdbSession session = Mockito.mock(OvsdbSession.class);
Mockito.when(session.getCustomerId()).thenReturn(2);
Mockito.when(ovsdbSessionMapInterface.getSession("Test_Client_21P10C68818122")).thenReturn(session);
assertEquals(2, opensyncExternalIntegrationMqttProcessor.extractCustomerIdFromTopic(topic));
}
@Test
public void testExtractEquipmentIdFromTopic() {
String topic = "/ap/Test_Client_21P10C68818122/opensync";
OvsdbSession session = Mockito.mock(OvsdbSession.class);
Mockito.when(session.getEquipmentId()).thenReturn(1L);
Mockito.when(ovsdbSessionMapInterface.getSession("Test_Client_21P10C68818122")).thenReturn(session);
assertEquals(1L, opensyncExternalIntegrationMqttProcessor.extractEquipmentIdFromTopic(topic));
}
@Test
public void testProcessMqttMessageStringReport() {
Equipment equipment = new Equipment();
equipment.setDetails(ApElementConfiguration.createWithDefaults());
equipment.setId(1L);
Mockito.when(
equipmentServiceInterface.getByInventoryIdOrNull(ArgumentMatchers.eq("Test_Client_21P10C68818122")))
.thenReturn(equipment);
equipment.setProfileId(0L);
Mockito.when(equipmentServiceInterface.getOrNull(1L)).thenReturn(equipment);
Mockito.when(equipmentServiceInterface.get(1L)).thenReturn(equipment);
Report report = Report.newBuilder().setNodeID("21P10C68818122")
.addAllClients(getOpensyncStatsClientReportsList())
.addAllEventReport(getOpensyncStatsEventReportsList()).build();
String topic = "/ap/Test_Client_21P10C68818122/opensync";
OvsdbSession session = Mockito.mock(OvsdbSession.class);
Mockito.when(session.getEquipmentId()).thenReturn(1L);
Mockito.when(session.getCustomerId()).thenReturn(2);
Mockito.when(ovsdbSessionMapInterface.getSession("Test_Client_21P10C68818122")).thenReturn(session);
Status bssidStatus = new Status();
bssidStatus.setStatusDataType(StatusDataType.ACTIVE_BSSIDS);
bssidStatus.setCustomerId(2);
ActiveBSSIDs activeBssidsDetails = new ActiveBSSIDs();
activeBssidsDetails.setActiveBSSIDs(getActiveBssidList());
bssidStatus.setDetails(activeBssidsDetails);
Mockito.when(statusServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(),
ArgumentMatchers.eq(StatusDataType.ACTIVE_BSSIDS))).thenReturn(bssidStatus);
Mockito.when(statusServiceInterface.update(ArgumentMatchers.any(Status.class))).thenReturn(bssidStatus);
com.telecominfraproject.wlan.client.models.Client clientInstance = new com.telecominfraproject.wlan.client.models.Client();
clientInstance.setMacAddress(MacAddress.valueOf("7C:AB:60:E6:EA:4D"));
clientInstance.setDetails(new ClientInfoDetails());
com.telecominfraproject.wlan.client.models.Client clientInstance2 = new com.telecominfraproject.wlan.client.models.Client();
clientInstance2.setMacAddress(MacAddress.valueOf("C0:9A:D0:76:A9:69"));
clientInstance2.setDetails(new ClientInfoDetails());
Mockito.when(
clientServiceInterface.getOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.any(MacAddress.class)))
.thenReturn(clientInstance).thenReturn(clientInstance2);
Mockito.when(clientServiceInterface
.update(ArgumentMatchers.any(com.telecominfraproject.wlan.client.models.Client.class)))
.thenReturn(clientInstance).thenReturn(clientInstance2);
ClientSession clientSession = new ClientSession();
clientSession.setMacAddress(MacAddress.valueOf("7C:AB:60:E6:EA:4D"));
clientSession.setDetails(new ClientSessionDetails());
ClientSession clientSession2 = new ClientSession();
clientSession2.setMacAddress(MacAddress.valueOf("C0:9A:D0:76:A9:69"));
clientSession2.setDetails(new ClientSessionDetails());
Mockito.when(clientServiceInterface.getSessionOrNull(ArgumentMatchers.anyInt(), ArgumentMatchers.anyLong(),
ArgumentMatchers.any(MacAddress.class))).thenReturn(clientSession).thenReturn(clientSession2);
Mockito.when(clientServiceInterface.updateSession(ArgumentMatchers.any(ClientSession.class)))
.thenReturn(clientSession).thenReturn(clientSession2);
opensyncExternalIntegrationMqttProcessor.processMqttMessage(topic, report);
// Mockito.verify(clientServiceInterface,
// Mockito.times(4)).getOrNull(Mockito.anyInt(),
// Mockito.any(MacAddress.class));
// Mockito.verify(clientServiceInterface,
// Mockito.times(4)).getSessionOrNull(Mockito.anyInt(),
// Mockito.anyLong(),
// Mockito.any(MacAddress.class));
// Mockito.verify(statusServiceInterface,
// Mockito.times(3)).getOrNull(Mockito.anyInt(), Mockito.anyLong(),
// Mockito.eq(StatusDataType.ACTIVE_BSSIDS));
}
@Ignore
public void testProcessMqttMessageStringFlowReport() {
// TODO: implement me when support flow reports
}
@Ignore
public void testProcessMqttMessageStringWCStatsReport() {
// TODO: implement me when wcs stats reports supported
}
@Test
public void testpopulateNetworkProbeMetrics() throws Exception {
InetAddress ip = InetAddress.getLocalHost();
DNSProbeMetric dnsProbeMetric = DNSProbeMetric.getDefaultInstance().toBuilder().setLatency(10)
.setState(StateUpDown.SUD_up).setServerIP(ip.getHostName()).build();
RADIUSMetrics radiusProbeMetric = RADIUSMetrics.getDefaultInstance().toBuilder().setLatency(10)
.setRadiusState(StateUpDown.SUD_up).setServerIP(ip.getHostName()).build();
VLANMetrics vlanMetrics = VLANMetrics.getDefaultInstance().toBuilder().setLatency(10)
.setDhcpState(StateUpDown.SUD_up).setVlanIF("vlan-1").build();
NetworkProbe networkProbe = NetworkProbe.getDefaultInstance().toBuilder().setVlanProbe(vlanMetrics)
.setDnsProbe(dnsProbeMetric).addRadiusProbe(radiusProbeMetric).build();
Report report = Report.getDefaultInstance().toBuilder().setNodeID("21P10C68818122")
.addNetworkProbe(networkProbe).build();
ApNodeMetrics apNodeMetrics = new ApNodeMetrics();
opensyncExternalIntegrationMqttProcessor.populateNetworkProbeMetrics(report, apNodeMetrics);
assertNotNull(apNodeMetrics.getNetworkProbeMetrics());
assert (apNodeMetrics.getNetworkProbeMetrics().get(0).getDnsLatencyMs() == 10);
assert (apNodeMetrics.getNetworkProbeMetrics().get(0).getDhcpLatencyMs() == 10);
assert (apNodeMetrics.getNetworkProbeMetrics().get(0).getRadiusState().equals(StateUpDownError.enabled));
assert (apNodeMetrics.getNetworkProbeMetrics().get(0).getDhcpState().equals(StateUpDownError.enabled));
assert (apNodeMetrics.getNetworkProbeMetrics().get(0).getDnsState().equals(StateUpDownError.enabled));
assert (apNodeMetrics.getNetworkProbeMetrics().get(0).getRadiusLatencyInMs() == 10);
assert (apNodeMetrics.getNetworkProbeMetrics().get(0).getVlanIF().equals("vlan-1"));
}
// Helper methods
private List<ActiveBSSID> getActiveBssidList() {
ActiveBSSID activeBssid = new ActiveBSSID();
activeBssid.setBssid("24:f5:a2:ef:2e:54");
activeBssid.setSsid("ssid-1");
activeBssid.setNumDevicesConnected(1);
activeBssid.setRadioType(RadioType.is2dot4GHz);
ActiveBSSID activeBssid2 = new ActiveBSSID();
activeBssid2.setBssid("24:f5:a2:ef:2e:55");
activeBssid2.setSsid("ssid-2");
activeBssid2.setNumDevicesConnected(1);
activeBssid2.setRadioType(RadioType.is5GHzL);
ActiveBSSID activeBssid3 = new ActiveBSSID();
activeBssid3.setBssid("24:f5:a2:ef:2e:56");
activeBssid3.setSsid("ssid-3");
activeBssid3.setNumDevicesConnected(1);
activeBssid3.setRadioType(RadioType.is5GHzU);
List<ActiveBSSID> bssidList = new ArrayList<>();
bssidList.add(activeBssid);
bssidList.add(activeBssid2);
bssidList.add(activeBssid3);
return bssidList;
}
private List<EventReport> getOpensyncStatsEventReportsList() {
sts.OpensyncStats.EventReport.ClientAssocEvent.Builder clientAssocBuilder = EventReport.ClientAssocEvent
.getDefaultInstance().toBuilder();
clientAssocBuilder.setAssocType(AssocType.ASSOC);
clientAssocBuilder.setBand(RadioBandType.BAND5GU);
clientAssocBuilder.setRssi(-65);
clientAssocBuilder.setStaMac("C0:9A:D0:76:A9:69");
clientAssocBuilder.setStaMacBytes(ByteString.copyFrom("C0:9A:D0:76:A9:69".getBytes()));
clientAssocBuilder.setSessionId(1000L);
clientAssocBuilder.setInternalSc(1);
clientAssocBuilder.setSsid("ssid-3");
clientAssocBuilder.setStatus(1);
clientAssocBuilder.setTimestampMs(System.currentTimeMillis());
List<EventReport> eventReportList = new ArrayList<>();
EventReport.Builder eventReportBuilder = EventReport.getDefaultInstance().toBuilder();
sts.OpensyncStats.EventReport.ClientSession.Builder clientSessionBuilder = sts.OpensyncStats.EventReport.ClientSession
.getDefaultInstance().toBuilder();
clientSessionBuilder.setSessionId(1000L);
clientSessionBuilder.setClientAssocEvent(clientAssocBuilder.build());
List<sts.OpensyncStats.EventReport.ClientSession> clientSessionList = new ArrayList<>();
clientSessionList.add(clientSessionBuilder.build());
sts.OpensyncStats.EventReport.ChannelSwitchEvent.Builder channelSwitchEventBuilder = sts.OpensyncStats.EventReport.ChannelSwitchEvent
.getDefaultInstance().toBuilder();
channelSwitchEventBuilder.setBand(RadioBandType.BAND5GL).setChannel(40)
.setReason(ChannelSwitchReason.high_interference).setTimestampMs(System.currentTimeMillis());
List<ChannelSwitchEvent> channelSwitchEventList = new ArrayList<>();
channelSwitchEventList.add(channelSwitchEventBuilder.build());
eventReportBuilder.addAllClientSession(clientSessionList);
eventReportBuilder.addAllChannelSwitch(channelSwitchEventList);
eventReportList.add(eventReportBuilder.build());
return eventReportList;
}
private List<ClientReport> getOpensyncStatsClientReportsList() {
int rssi = Long.valueOf(4294967239L).intValue();
Client.Stats clientStats = Client.Stats.getDefaultInstance().toBuilder().setRssi(rssi).setRxBytes(225554786)
.setRxRate(24000.0).setTxBytes(1208133026).setTxRate(433300.0).setRssi(758722570).setRxFrames(10000)
.setTxFrames(10000).setTxRate(24000.0).build();
Client client2g = Client.getDefaultInstance().toBuilder().setMacAddress("7C:AB:60:E6:EA:4D").setSsid("ssid-1")
.setConnected(true).setDurationMs(59977).setStats(clientStats).build();
Client client5gu = Client.getDefaultInstance().toBuilder().setMacAddress("C0:9A:D0:76:A9:69").setSsid("ssid-3")
.setConnected(true).setDurationMs(298127).setStats(clientStats).build();
ClientReport clientReport2g = ClientReport.getDefaultInstance().toBuilder().setBand(RadioBandType.BAND2G)
.setChannel(6).addAllClientList(ImmutableList.of(client2g)).build();
ClientReport clientReport5gl = ClientReport.getDefaultInstance().toBuilder().setBand(RadioBandType.BAND5GL)
.setChannel(36).addAllClientList(new ArrayList<Client>()).build();
ClientReport clientReport5gu = ClientReport.getDefaultInstance().toBuilder().setBand(RadioBandType.BAND5GU)
.setChannel(157).addAllClientList(ImmutableList.of(client5gu)).build();
List<ClientReport> clients = new ArrayList<>();
clients.add(clientReport2g);
clients.add(clientReport5gl);
clients.add(clientReport5gu);
return clients;
}
}

View File

@@ -159,130 +159,6 @@ public class RealtimeEventPublisherTest {
// TODO: implement
}
@Test
public void testPublishDhcpTransactionEvents() throws Exception {
long timestamp = System.currentTimeMillis();
List<DhcpTransaction> dhcpTransactionList = new ArrayList<>();
DhcpAckEvent ackEvent = DhcpAckEvent.newBuilder()
.setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.250").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("c0:9a:d0:76:a9:69")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build())
.setGatewayIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setPrimaryDns(ByteString.copyFrom(InetAddress.getByName("64.71.255.204").getAddress()))
.setSecondaryDns(ByteString.copyFrom(InetAddress.getByName("64.71.255.198").getAddress()))
.setSubnetMask(ByteString.copyFrom(InetAddress.getByName("255.255.255.0").getAddress()))
.setLeaseTime(172800).setTimeOffset(10).build();
DhcpAckEvent ackEvent2 = DhcpAckEvent.newBuilder()
.setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.65").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("f6:f0:65:99:e2:33")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build())
.setGatewayIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setPrimaryDns(ByteString.copyFrom(InetAddress.getByName("64.71.255.204").getAddress()))
.setSecondaryDns(ByteString.copyFrom(InetAddress.getByName("64.71.255.198").getAddress()))
.setSubnetMask(ByteString.copyFrom(InetAddress.getByName("255.255.255.0").getAddress()))
.setLeaseTime(172800).setTimeOffset(10).build();
List<DhcpAckEvent> ackEventList = List.of(ackEvent, ackEvent2);
DhcpNakEvent nakEvent1 = DhcpNakEvent.newBuilder().setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.129").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("24:f5:a2:ef:2e:53")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build()).setFromInternal(true).build();
List<DhcpNakEvent> nakEventList = List.of(nakEvent1);
DhcpOfferEvent offerEvent1 = DhcpOfferEvent.newBuilder().setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.250").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("c0:9a:d0:76:a9:69")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build()).setFromInternal(true).build();
DhcpOfferEvent offerEvent2 = DhcpOfferEvent.newBuilder().setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.65").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("f6:f0:65:99:e2:33")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build()).setFromInternal(true).build();
List<DhcpOfferEvent> offerEventList = List.of(offerEvent1,offerEvent2);
DhcpDiscoverEvent discoverEvent1 = DhcpDiscoverEvent.newBuilder().setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.250").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("c0:9a:d0:76:a9:69")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build()).setHostname("My-iPhone").build();
DhcpDiscoverEvent discoverEvent2 = DhcpDiscoverEvent.newBuilder().setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.65").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("f6:f0:65:99:e2:33")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build()).setHostname("My-iPad").build();
List<DhcpDiscoverEvent> discoverEventList = List.of(discoverEvent1,discoverEvent2);
DhcpRequestEvent requestEvent1 = DhcpRequestEvent.newBuilder().setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.250").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("c0:9a:d0:76:a9:69")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build()).setHostname("My-iPhone").build();
DhcpRequestEvent requestEvent2 = DhcpRequestEvent.newBuilder().setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.65").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("f6:f0:65:99:e2:33")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build()).setHostname("My-iPad").build();
List<DhcpRequestEvent> requestEventList = List.of(requestEvent1,requestEvent2);
DhcpInformEvent informEvent = DhcpInformEvent.newBuilder().setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.250").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("c0:9a:d0:76:a9:69")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build()).build();
List<DhcpInformEvent> informEventList = List.of(informEvent);
DhcpDeclineEvent declineEvent = DhcpDeclineEvent.newBuilder().setDhcpCommonData(DhcpCommonData.newBuilder(DhcpCommonData.getDefaultInstance())
.setClientIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.129").getAddress()))
.setDhcpServerIp(ByteString.copyFrom(InetAddress.getByName("10.0.0.1").getAddress()))
.setDeviceMacAddress("24:f5:a2:ef:2e:53")
.setXId(123456789)
.setTimestampMs(Long.valueOf(timestamp/1000).intValue()).build()).build();
List<DhcpDeclineEvent> declineEventList = List.of(declineEvent);
DhcpTransaction dhcpTransaction = DhcpTransaction.newBuilder(DhcpTransaction.getDefaultInstance())
.addAllDhcpAckEvent(ackEventList).addAllDhcpNakEvent(nakEventList).addAllDhcpOfferEvent(offerEventList)
.addAllDhcpInformEvent(informEventList).addAllDhcpDeclineEvent(declineEventList)
.addAllDhcpDiscoverEvent(discoverEventList).addAllDhcpRequestEvent(requestEventList).setXId(123456789)
.build();
dhcpTransactionList.add(dhcpTransaction);
realtimeEventPublisher.publishDhcpTransactionEvents(2, 1L, 0L, dhcpTransactionList);
Mockito.verify(cloudEventDispatcherInterface,Mockito.times(1)).publishEventsBulk(Mockito.anyList());
}
@Test
public void testPublishSipCallEvents() throws Exception {

View File

@@ -1,11 +1,9 @@
<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">
<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>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>opensync-ext-interface</artifactId>
@@ -15,33 +13,33 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>base-models</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-opensync-protobuf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>profile-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>location-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>routing-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>

View File

@@ -35,22 +35,25 @@ public interface OpensyncExternalIntegrationInterface {
void wifiInetStateDbTableUpdate(List<OpensyncAPInetState> inetStateTables, String apId);
void wifiInetStateDbTableDelete(List<OpensyncAPInetState> inetStateTables, String apId);
void processMqttMessage(String topic, Report report);
void processMqttMessage(String topic, FlowReport flowReport);
void processMqttMessage(String topic, WCStatsReport wcStatsReport);
void wifiAssociatedClientsDbTableUpdate(List<OpensyncWifiAssociatedClients> wifiAssociatedClients, String apId);
void wifiAssociatedClientsDbTableDelete(String deletedClientMac, String apId);
void awlanNodeDbTableUpdate(OpensyncAWLANNode opensyncAPState, String apId);
void dhcpLeasedIpDbTableUpdate(List<Map<String,String>> dhcpAttributes, String apId, RowUpdateOperation rowUpdateOperation);
void commandStateDbTableUpdate(List<Map<String,String>> commandStateAttributes, String apId, RowUpdateOperation rowUpdateOperation);
void dhcpLeasedIpDbTableUpdate(List<Map<String, String>> dhcpAttributes, String apId,
RowUpdateOperation rowUpdateOperation);
void commandStateDbTableUpdate(List<Map<String, String>> commandStateAttributes, String apId,
RowUpdateOperation rowUpdateOperation);
void apcStateDbTableUpdate(Map<String, String> apcStateAttributes, String apId,
RowUpdateOperation rowUpdateOperation);
void nodeStateDbTableUpdate(List<Map<String, String>> nodeStateAttributes, String apId);
void clearEquipmentStatus(String apId);
void processMqttMessage(String topic, Report report);
}

View File

@@ -4,8 +4,10 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import com.telecominfraproject.wlan.core.model.equipment.LedStatus;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes;
public interface OvsdbClientInterface {
@@ -16,6 +18,8 @@ public interface OvsdbClientInterface {
String startDebugEngine(String apId, String gatewayHostname, Integer gatewayPort);
String stopDebugEngine(String apId);
String processBlinkRequest(String apId, boolean blinkAllLEDs);
void processConfigChanged(String apId);
@@ -33,4 +37,6 @@ public interface OvsdbClientInterface {
String processNewChannelsRequest(String apId, Map<RadioType,Integer> backupChannelMap, Map<RadioType,Integer> primaryChannelMap);
String processCellSizeAttributesRequest(String apId, Map<RadioType, CellSizeAttributes> cellSizeAttributeMap);
}

View File

@@ -7,7 +7,6 @@ public class OvsdbSession {
private String apId;
private long routingId;
private long equipmentId;
private int customerId;
public OvsdbClient getOvsdbClient() {
return ovsdbClient;
@@ -33,12 +32,5 @@ public class OvsdbSession {
public void setEquipmentId(long equipmentId) {
this.equipmentId = equipmentId;
}
public int getCustomerId() {
return customerId;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
}

View File

@@ -1,3 +1,4 @@
package com.telecominfraproject.wlan.opensync.external.integration.models;
import java.util.HashMap;
@@ -26,6 +27,13 @@ public class ConnectNodeInfo implements Cloneable {
public String lanIfName;
public String lanIfType;
public String lanMacAddress;
public String referenceDesign;
public Map<String, String> qrCode;
public String modelDescription;
public String manufacturerUrl;
public String manufacturerName;
public String manufacturerDate;
public String certificationRegion;
@Override
public ConnectNodeInfo clone() {
@@ -40,6 +48,9 @@ public class ConnectNodeInfo implements Cloneable {
if (this.versionMatrix != null) {
ret.versionMatrix = new HashMap<>(this.versionMatrix);
}
if (this.qrCode != null) {
ret.qrCode = new HashMap<>(this.qrCode);
}
return ret;
} catch (CloneNotSupportedException e) {
throw new IllegalStateException("Cannot clone ", e);
@@ -47,44 +58,45 @@ public class ConnectNodeInfo implements Cloneable {
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof ConnectNodeInfo)) {
return false;
}
ConnectNodeInfo other = (ConnectNodeInfo) obj;
return Objects.equals(country, other.country) && Objects.equals(firmwareVersion, other.firmwareVersion)
&& Objects.equals(ifName, other.ifName) && Objects.equals(ifType, other.ifType)
&& Objects.equals(ipV4Address, other.ipV4Address) && Objects.equals(lanIfName, other.lanIfName)
&& Objects.equals(lanIfType, other.lanIfType) && Objects.equals(lanIpV4Address, other.lanIpV4Address)
&& Objects.equals(lanMacAddress, other.lanMacAddress) && Objects.equals(macAddress, other.macAddress)
&& Objects.equals(managerAddr, other.managerAddr) && Objects.equals(model, other.model)
&& Objects.equals(mqttSettings, other.mqttSettings)
&& Objects.equals(platformVersion, other.platformVersion)
&& Objects.equals(redirectorAddr, other.redirectorAddr) && Objects.equals(revision, other.revision)
&& Objects.equals(serialNumber, other.serialNumber) && Objects.equals(skuNumber, other.skuNumber)
&& Objects.equals(versionMatrix, other.versionMatrix)
&& Objects.equals(wifiRadioStates, other.wifiRadioStates);
public int hashCode() {
return Objects.hash(certificationRegion, country, firmwareVersion, ifName, ifType, ipV4Address, lanIfName, lanIfType, lanIpV4Address, lanMacAddress,
macAddress, managerAddr, manufacturerDate, manufacturerName, manufacturerUrl, model, modelDescription, mqttSettings, platformVersion, qrCode,
redirectorAddr, referenceDesign, revision, serialNumber, skuNumber, versionMatrix, wifiRadioStates);
}
@Override
public int hashCode() {
return Objects.hash(country, firmwareVersion, ifName, ifType, ipV4Address, lanIfName, lanIfType, lanIpV4Address,
lanMacAddress, macAddress, managerAddr, model, mqttSettings, platformVersion, redirectorAddr, revision,
serialNumber, skuNumber, versionMatrix, wifiRadioStates);
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ConnectNodeInfo other = (ConnectNodeInfo) obj;
return Objects.equals(certificationRegion, other.certificationRegion) && Objects.equals(country, other.country)
&& Objects.equals(firmwareVersion, other.firmwareVersion) && Objects.equals(ifName, other.ifName) && Objects.equals(ifType, other.ifType)
&& Objects.equals(ipV4Address, other.ipV4Address) && Objects.equals(lanIfName, other.lanIfName) && Objects.equals(lanIfType, other.lanIfType)
&& Objects.equals(lanIpV4Address, other.lanIpV4Address) && Objects.equals(lanMacAddress, other.lanMacAddress)
&& Objects.equals(macAddress, other.macAddress) && Objects.equals(managerAddr, other.managerAddr)
&& Objects.equals(manufacturerDate, other.manufacturerDate) && Objects.equals(manufacturerName, other.manufacturerName)
&& Objects.equals(manufacturerUrl, other.manufacturerUrl) && Objects.equals(model, other.model)
&& Objects.equals(modelDescription, other.modelDescription) && Objects.equals(mqttSettings, other.mqttSettings)
&& Objects.equals(platformVersion, other.platformVersion) && Objects.equals(qrCode, other.qrCode)
&& Objects.equals(redirectorAddr, other.redirectorAddr) && Objects.equals(referenceDesign, other.referenceDesign)
&& Objects.equals(revision, other.revision) && Objects.equals(serialNumber, other.serialNumber) && Objects.equals(skuNumber, other.skuNumber)
&& Objects.equals(versionMatrix, other.versionMatrix) && Objects.equals(wifiRadioStates, other.wifiRadioStates);
}
@Override
public String toString() {
return "ConnectNodeInfo [mqttSettings=" + mqttSettings + ", versionMatrix=" + versionMatrix
+ ", wifiRadioStates=" + wifiRadioStates + ", redirectorAddr=" + redirectorAddr + ", managerAddr="
+ managerAddr + ", skuNumber=" + skuNumber + ", serialNumber=" + serialNumber + ", macAddress="
+ macAddress + ", ipV4Address=" + ipV4Address + ", platformVersion=" + platformVersion
+ ", firmwareVersion=" + firmwareVersion + ", revision=" + revision + ", model=" + model + ", ifName="
+ ifName + ", ifType=" + ifType + ", country=" + country + ", lanIpV4Address=" + lanIpV4Address
+ ", lanIfName=" + lanIfName + ", lanIfType=" + lanIfType + ", lanMacAddress=" + lanMacAddress + "]";
return "ConnectNodeInfo [mqttSettings=" + mqttSettings + ", versionMatrix=" + versionMatrix + ", wifiRadioStates=" + wifiRadioStates
+ ", redirectorAddr=" + redirectorAddr + ", managerAddr=" + managerAddr + ", skuNumber=" + skuNumber + ", serialNumber=" + serialNumber
+ ", macAddress=" + macAddress + ", ipV4Address=" + ipV4Address + ", platformVersion=" + platformVersion + ", firmwareVersion="
+ firmwareVersion + ", revision=" + revision + ", model=" + model + ", ifName=" + ifName + ", ifType=" + ifType + ", country=" + country
+ ", lanIpV4Address=" + lanIpV4Address + ", lanIfName=" + lanIfName + ", lanIfType=" + lanIfType + ", lanMacAddress=" + lanMacAddress
+ ", referenceDesign=" + referenceDesign + ", qrCode=" + qrCode + ", modelDescription=" + modelDescription + ", manufacturerUrl="
+ manufacturerUrl + ", manufacturerName=" + manufacturerName + ", manufacturerDate=" + manufacturerDate + ", certificationRegion="
+ certificationRegion + "]";
}
}

View File

@@ -38,6 +38,7 @@ public class OpensyncAPConfig extends OpensyncAPBase {
private List<Profile> ssidProfile;
private List<Profile> metricsProfile;
private List<Profile> radiusProfiles;
private Profile wiredEthernetPortProfile;
private Location equipmentLocation;
private EquipmentRoutingRecord equipmentRouting;
private EquipmentGatewayRecord equipmentGateway;
@@ -136,7 +137,8 @@ public class OpensyncAPConfig extends OpensyncAPBase {
&& Objects.equals(hotspotConfig, other.hotspotConfig)
&& Objects.equals(metricsProfile, other.metricsProfile)
&& Objects.equals(radiusProfiles, other.radiusProfiles) && Objects.equals(rfProfile, other.rfProfile)
&& Objects.equals(ssidProfile, other.ssidProfile);
&& Objects.equals(ssidProfile, other.ssidProfile)
&& Objects.equals(wiredEthernetPortProfile, other.wiredEthernetPortProfile);
}
public Profile getApProfile() {
@@ -195,11 +197,15 @@ public class OpensyncAPConfig extends OpensyncAPBase {
return ssidProfile;
}
public Profile getWiredEthernetPortProfile() {
return wiredEthernetPortProfile;
}
@Override
public int hashCode() {
return Objects.hash(apProfile, blockedClients, bonjourGatewayProfiles, captiveProfiles, customerEquipment,
equipmentGateway, equipmentLocation, equipmentRouting, hotspotConfig, metricsProfile, radiusProfiles,
rfProfile, ssidProfile);
rfProfile, ssidProfile, wiredEthernetPortProfile);
}
public void setApProfile(Profile apProfile) {
@@ -325,4 +331,8 @@ public class OpensyncAPConfig extends OpensyncAPBase {
this.ssidProfile = ssidProfile;
}
public void setWiredEthernetPortProfile(Profile wiredEthernetPortProfile) {
this.wiredEthernetPortProfile = wiredEthernetPortProfile;
}
}

View File

@@ -22,8 +22,10 @@ public class OpensyncAPInetState extends OpensyncAPBase {
public String ifType;
public String softwdsMacAddr;
public boolean enabled;
public Map<String, String> ethPorts;
public boolean sofwdsWrap;
public int vlanId;
public Map<String, String> vlanTrunk;
public String netmask;
public boolean nat;
public String greRemoteInetAddr;
@@ -43,17 +45,21 @@ public class OpensyncAPInetState extends OpensyncAPBase {
public Uuid _uuid;
public Uuid version;
public String greLocalInetAddr;
// the following attribute is in inetC but not in inetS
public String greRemoteMacAddr;
public OpensyncAPInetState() {
dns = new HashMap<>();
dhcpc = new HashMap<>();
ethPorts = new HashMap<>();
vlanTrunk = new HashMap<>();
}
public OpensyncAPInetState(Row row) {
dns = new HashMap<>();
dhcpc = new HashMap<>();
ethPorts = new HashMap<>();
vlanTrunk = new HashMap<>();
Map<String, Value> map = row.getColumns();
@@ -83,6 +89,12 @@ public class OpensyncAPInetState extends OpensyncAPBase {
if (map.containsKey("dns")) {
this.setDns(row.getMapColumn("dns"));
}
if (map.containsKey("eth_ports")) {
this.setEthPorts(row.getMapColumn("eth_ports"));
}
if (map.containsKey("vlan_trunk")) {
this.setVlanTrunk(row.getMapColumn("vlan_trunk"));
}
if (map.get("inet_addr") != null
&& map.get("inet_addr").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setInetAddr(row.getStringColumn("inet_addr"));
@@ -157,6 +169,12 @@ public class OpensyncAPInetState extends OpensyncAPBase {
if (!Objects.equals(dhcpd, other.dhcpd)) {
return false;
}
if (!Objects.equals(ethPorts, other.ethPorts)) {
return false;
}
if (!Objects.equals(vlanTrunk, other.vlanTrunk)) {
return false;
}
if (!Objects.equals(dns, other.dns)) {
return false;
}
@@ -251,6 +269,14 @@ public class OpensyncAPInetState extends OpensyncAPBase {
public Map<String, String> getDns() {
return dns;
}
public Map<String, String> getEthPorts() {
return ethPorts;
}
public Map<String, String> getVlanTrunk() {
return vlanTrunk;
}
public String getGateway() {
return gateway;
@@ -330,9 +356,9 @@ public class OpensyncAPInetState extends OpensyncAPBase {
@Override
public int hashCode() {
return Objects.hash(_uuid, broadcast, dhcpc, dhcpd, dns, enabled, gateway, greIfName, greLocalInetAddr, greRemoteInetAddr,
return Objects.hash(_uuid, broadcast, dhcpc, dhcpd, dns, ethPorts, enabled, gateway, greIfName, greLocalInetAddr, greRemoteInetAddr,
hwAddr, ifName, ifType, ifUuid, inetAddr, inetConfig, ipAssignScheme, mtw, nat, netmask, network,
parentIfName, greRemoteMacAddr, softwdsMacAddr, sofwdsWrap, unpnpMode, version, vlanId);
parentIfName, greRemoteMacAddr, softwdsMacAddr, sofwdsWrap, unpnpMode, version, vlanId, vlanTrunk);
}
public boolean isEnabled() {
@@ -370,6 +396,14 @@ public class OpensyncAPInetState extends OpensyncAPBase {
public void setDns(Map<String, String> dns) {
this.dns = dns;
}
public void setEthPorts(Map<String, String> ethPorts) {
this.ethPorts = ethPorts;
}
public void setVlanTrunk(Map<String, String> vlanTrunk) {
this.vlanTrunk = vlanTrunk;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
@@ -466,9 +500,9 @@ public class OpensyncAPInetState extends OpensyncAPBase {
@Override
public String toString() {
return "OpensyncAPInetState [ifName=" + ifName + ", dhcpd=" + dhcpd + ", unpnpMode=" + unpnpMode + ", ifType="
return "OpensyncAPInetState [ifName=" + ifName + ", dhcpd=" + dhcpd + ", ethPorts=" + ethPorts + ", unpnpMode=" + unpnpMode + ", ifType="
+ ifType + ", softwdsMacAddr=" + softwdsMacAddr + ", enabled=" + enabled + ", sofwdsWrap=" + sofwdsWrap
+ ", vlanId=" + vlanId + ", netmask=" + netmask + ", nat=" + nat + ", greRemoteInetAddr="
+ ", vlanId=" + vlanId + ", vlanTrunk=" + vlanTrunk + ", netmask=" + netmask + ", nat=" + nat + ", greRemoteInetAddr="
+ greRemoteInetAddr + ", ifUuid=" + ifUuid + ", inetAddr=" + inetAddr + ", hwAddr=" + hwAddr + ", mtw="
+ mtw + ", network=" + network + ", dns=" + dns + ", parentIfName=" + parentIfName + ", greIfName="
+ greIfName + ", broadcast=" + broadcast + ", dhcpc=" + dhcpc + ", gateway=" + gateway

View File

@@ -1,6 +1,7 @@
/**
*
*/
package com.telecominfraproject.wlan.opensync.external.integration.models;
import java.util.HashMap;
@@ -45,6 +46,14 @@ public class OpensyncAWLANNode extends OpensyncAPBase {
public String revision;
public String managerAddr;
public boolean factoryReset;
public String referenceDesign;
public Map<String, String> qrCode;
public String modelDescription;
public String manufacturerUrl;
public String manufacturerName;
public String manufacturerDate;
public String certificationRegion;
public Uuid _uuid;
public Uuid version;
@@ -59,8 +68,39 @@ public class OpensyncAWLANNode extends OpensyncAPBase {
public OpensyncAWLANNode(Row row) {
this();
// mqtt_settings {"key":"string","max":"unlimited","min":0,"value":"string"}
// model {"key":"string","min":0}
// sku_number {"key":"string","min":0}
// version_matrix {"key":"string","max":"unlimited","min":0,"value":{"maxLength":128,"type":"string"}}
// model_description "string"
// certification_region "string"
// id "string"
// firmware_version "string"
// firmware_url {"key":{"maxLength":256,"type":"string"}}
// _uuid "uuid"
// upgrade_dl_timer "integer"
// reference_design "string"
// platform_version "string"
// firmware_pass {"key":{"maxLength":256,"type":"string"}}
// upgrade_timer "integer"
// redirector_addr "string"
// led_config {"key":"string","max":"unlimited","min":0,"value":"string"}
// max_backoff "integer"
// mqtt_headers {"key":"string","max":"unlimited","min":0,"value":"string"}
// serial_number {"key":"string","min":0}
// _version "uuid"
// upgrade_status "integer"
// device_mode {"key":{"enum":["set",["battery","cloud","custom","monitor"]],"type":"string"},"min":0}
// min_backoff "integer"
// manufacturer_date "string"
// mqtt_topics {"key":"string","max":"unlimited","min":0,"value":{"maxLength":128,"type":"string"}}
// revision "string"
// manufacturer_name "string"
// manufacturer_url "string"
// manager_addr "string"
// factory_reset {"key":"boolean","min":0}
Map<String, Value> map = row.getColumns();
if (map.get("mqtt_settings") != null) {
this.setMqttSettings(row.getMapColumn("mqtt_settings"));
}
@@ -70,93 +110,89 @@ public class OpensyncAWLANNode extends OpensyncAPBase {
if (map.get("mqtt_topics") != null) {
this.setMqttHeaders(row.getMapColumn("mqtt_topics"));
}
if ((map.get("model") != null)
&& map.get("model").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("model") != null) && map.get("model").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setModel(row.getStringColumn("model"));
}
if ((map.get("sku_number") != null)
&& map.get("sku_number").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("sku_number") != null) && map.get("sku_number").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setSkuNumber(row.getStringColumn("sku_number"));
}
if ((map.get("id") != null)
&& map.get("id").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setId(row.getStringColumn("id"));
if (map.get("id") != null) {
this.setId(getSingleValueFromSet(row, "id"));
}
if (map.get("reference_design") != null) {
this.setReferenceDesign(row.getStringColumn("reference_design"));
}
if (map.get("qr_code") != null) {
this.setQrCode(row.getMapColumn("qr_code"));
}
if ((map.get("model_description") != null)) {
this.setModelDescription(row.getStringColumn("model_description"));
}
if ((map.get("manufacturer_url") != null)) {
this.setManufacturerUrl(row.getStringColumn("manufacturer_url"));
}
if ((map.get("manufacturer_name") != null)) {
this.setManufacturerName(row.getStringColumn("manufacturer_name"));
}
if ((map.get("manufacturer_date") != null)) {
this.setManufacturerDate(row.getStringColumn("manufacturer_date"));
}
if (map.get("certification_region") != null) {
this.setCertificationRegion(row.getStringColumn("certification_region"));
}
if (map.get("version_matrix") != null) {
this.setVersionMatrix(row.getMapColumn("version_matrix"));
}
if ((map.get("firmware_version") != null) && map.get("firmware_version").getClass()
.equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("firmware_version") != null) && map.get("firmware_version").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setFirmwareVersion(row.getStringColumn("firmware_version"));
}
if ((map.get("firmware_url") != null)
&& map.get("firmware_url").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("firmware_url") != null) && map.get("firmware_url").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setFirmwareUrl(row.getStringColumn("firmware_url"));
}
if ((map.get("_uuid") != null)
&& map.get("_uuid").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("_uuid") != null) && map.get("_uuid").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setVersion(row.getUuidColumn("_uuid"));
}
if ((map.get("upgrade_dl_timer") != null) && map.get("upgrade_dl_timer").getClass()
.equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("upgrade_dl_timer") != null) && map.get("upgrade_dl_timer").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setUpgradeDlTimer(row.getIntegerColumn("upgrade_dl_timer").intValue());
}
if ((map.get("platform_version") != null) && map.get("platform_version").getClass()
.equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("platform_version") != null) && map.get("platform_version").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setPlatformVersion(row.getStringColumn("platform_version"));
}
if ((map.get("firmware_pass") != null) && map.get("firmware_pass").getClass()
.equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("firmware_pass") != null) && map.get("firmware_pass").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setFirmwarePass(row.getStringColumn("firmware_pass"));
}
if ((map.get("upgrade_timer") != null) && map.get("upgrade_timer").getClass()
.equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("upgrade_timer") != null) && map.get("upgrade_timer").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setUpgradeTimer(row.getIntegerColumn("upgrade_timer").intValue());
}
if ((map.get("max_backoff") != null)
&& map.get("max_backoff").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("max_backoff") != null) && map.get("max_backoff").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setMaxBackoff(row.getIntegerColumn("max_backoff").intValue());
}
if (map.get("led_config") != null) {
this.setLedConfig(row.getMapColumn("led_config"));
}
if ((map.get("redirector_addr") != null) && map.get("redirector_addr").getClass()
.equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("redirector_addr") != null) && map.get("redirector_addr").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setRedirectorAddr(row.getStringColumn("redirector_addr"));
}
if ((map.get("serial_number") != null) && map.get("serial_number").getClass()
.equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("serial_number") != null) && map.get("serial_number").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setSerialNumber(row.getStringColumn("serial_number"));
}
if ((map.get("_version") != null)
&& map.get("_version").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("_version") != null) && map.get("_version").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setVersion(row.getUuidColumn("_version"));
}
this.setUpgradeStatus(row.getIntegerColumn("upgrade_status").intValue());
if ((map.get("device_mode") != null)
&& map.get("device_mode").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("device_mode") != null) && map.get("device_mode").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setDeviceMode(row.getStringColumn("device_mode"));
}
if ((map.get("min_backoff") != null)
&& map.get("min_backoff").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("min_backoff") != null) && map.get("min_backoff").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setMinBackoff(row.getIntegerColumn("min_backoff").intValue());
}
if ((map.get("revision") != null)
&& map.get("revision").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("revision") != null) && map.get("revision").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setRevision(row.getStringColumn("revision"));
}
if ((map.get("manager_addr") != null)
&& map.get("manager_addr").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("manager_addr") != null) && map.get("manager_addr").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setManagerAddr(row.getStringColumn("manager_addr"));
}
if ((map.get("factory_reset") != null) && map.get("factory_reset").getClass()
.equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
if ((map.get("factory_reset") != null) && map.get("factory_reset").getClass().equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) {
this.setFactoryReset(row.getBooleanColumn("factory_reset"));
}
}
@@ -261,6 +297,62 @@ public class OpensyncAWLANNode extends OpensyncAPBase {
return factoryReset;
}
public String getReferenceDesign() {
return referenceDesign;
}
public void setReferenceDesign(String referenceDesign) {
this.referenceDesign = referenceDesign;
}
public Map<String, String> getQrCode() {
return qrCode;
}
public void setQrCode(Map<String, String> qrCode) {
this.qrCode = qrCode;
}
public String getModelDescription() {
return modelDescription;
}
public void setModelDescription(String modelDescription) {
this.modelDescription = modelDescription;
}
public String getManufacturerUrl() {
return manufacturerUrl;
}
public void setManufacturerUrl(String manufacturerUrl) {
this.manufacturerUrl = manufacturerUrl;
}
public String getManufacturerName() {
return manufacturerName;
}
public void setManufacturerName(String manufacturerName) {
this.manufacturerName = manufacturerName;
}
public String getManufacturerDate() {
return manufacturerDate;
}
public void setManufacturerDate(String manufacturerDate) {
this.manufacturerDate = manufacturerDate;
}
public String getCertificationRegion() {
return certificationRegion;
}
public void setCertificationRegion(String certificationRegion) {
this.certificationRegion = certificationRegion;
}
public void set_uuid(Uuid _uuid) {
this._uuid = _uuid;
}

View File

@@ -0,0 +1,14 @@
package com.telecominfraproject.wlan.opensync.external.integration.utils;
import com.telecominfraproject.wlan.systemevent.models.SystemEvent;
import sts.OpensyncStats.Report;
public interface StatsPublisherInterface {
void processMqttMessage(String topic, Report report);
void publishSystemEventFromTableStateMonitor(SystemEvent event);
}

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>opensync-ext-static</artifactId>
@@ -13,7 +13,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>opensync-gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@@ -44,7 +44,7 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr
@Value("${tip.wlan.ovsdb.ssidProfileFileName:/app/config/ProfileSsid.json}")
private String ssidProfileFileName;
@Value("${tip.wlan.ovsdb.radiusProfileFileName:/app/config/ProfileRadius.json}")
private String radiusProfileFileName;
@@ -84,7 +84,6 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr
List<com.telecominfraproject.wlan.profile.models.Profile> ssidProfiles = com.telecominfraproject.wlan.profile.models.Profile
.listFromFile(ssidProfileFileName, com.telecominfraproject.wlan.profile.models.Profile.class);
ssidProfiles.stream().forEach(p -> apProfile.getChildProfileIds().add(p.getId()));
equipment.setProfileId(apProfile.getId());
Location location = Location.fromFile(locationFileName, Location.class);
@@ -120,7 +119,6 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr
LOG.info("Received EventReport {}", e);
});
}
public void processMqttMessage(String topic, FlowReport flowReport) {
@@ -198,8 +196,20 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr
@Override
public void clearEquipmentStatus(String apId) {
LOG.info("Received clearEquipmentStatus for ap {}",apId);
LOG.info("Received clearEquipmentStatus for ap {}", apId);
}
@Override
public void apcStateDbTableUpdate(Map<String, String> apcStateAttributes, String apId,
RowUpdateOperation rowUpdateOperation) {
LOG.info("Received APC_State {} for operation {}", apcStateAttributes, rowUpdateOperation);
}
@Override
public void nodeStateDbTableUpdate(List<Map<String, String>> nodeStateAttributes, String apId) {
LOG.info("nodeStateDbTableUpdate for AP {}", apId);
}
}

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>opensync-gateway-build</artifactId>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>opensync-gateway-cloud-docker</artifactId>
@@ -22,7 +22,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>opensync-gateway-cloud-process</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -30,6 +30,22 @@
</triggeringPolicy>
</appender>
<appender name="mqttMsgTracer" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/app/logs/mqttMsgTracer.log</file>
<append>true</append>
<encoder>
<pattern>%date %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>/app/logs/mqttMsgTracer.%i.log.gz</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>20MB</maxFileSize>
</triggeringPolicy>
</appender>
<appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/app/logs/opensyncgw.log</file>
<append>true</append>
@@ -67,7 +83,7 @@
<logger name="com.vmware.ovsdb.service.OvsdbConnectionInfo" level="OFF"/>
<logger name="com.vmware.ovsdb.netty.OvsdbConnectionHandler" level="ERROR"/>
<logger name="MQTT_DATA" level="DEBUG" additivity="false">
<logger name="MQTT_DATA" level="INFO" additivity="false">
<appender-ref ref="mqttDataFile"/>
</logger>

View File

@@ -22,6 +22,8 @@ FILE_STORE_DIRECTORY="${FILE_STORE_DIRECTORY_INTERNAL:=/tmp/filestore}"
FILE_STORE_EXTERNAL_URL="${FILE_STORE_URL}"
MQTT_BROKER_EXTERNAL_PORT="${MQTT_BROKER_EXTERNAL_PORT}"
OVSDB_EXTERNAL_PORT="${OVSDB_EXTERNAL_PORT}"
OFF_CHANNEL_REPORTING_INTERVAL_SECONDS="${OFF_CHANNEL_REPORTING_INTERVAL_SECONDS:=120}"
REPORTING_INTERVAL_SECONDS="${REPORTING_INTERVAL_SECONDS:=60}"
@@ -106,6 +108,8 @@ PROV_PROPS+=" -Dtip.wlan.ovsdb.wifi-iface.default_wan_type=$DEFAULT_WAN_TYPE"
PROV_PROPS+=" -Dtip.wlan.ovsdb.wifi-iface.default_wan_name=$DEFAULT_WAN_NAME"
PROV_PROPS+=" -Dtip.wlan.ovsdb.wifi-iface.default_lan_type=$DEFAULT_LAN_TYPE"
PROV_PROPS+=" -Dtip.wlan.ovsdb.wifi-iface.default_lan_name=$DEFAULT_LAN_NAME"
PROV_PROPS+=" -Dtip.wlan.defaultOffChannelReportingIntervalSeconds=$OFF_CHANNEL_REPORTING_INTERVAL_SECONDS"
PROV_PROPS+=" -Dtip.wlan.defaultReportingIntervalSeconds=$REPORTING_INTERVAL_SECONDS"
PROV_PROPS+=" -Dtip.wlan.ovsdb.autoProvisionedCustomerId=$AUTO_PROV_CUSTOMER_ID"

View File

@@ -1,11 +1,9 @@
<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">
<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>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>opensync-gateway-cloud-process</artifactId>
@@ -22,95 +20,95 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>opensync-ext-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>filestore-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>customer-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>location-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>equipment-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>profile-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>portal-user-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>service-metric-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>system-event-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>alarm-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>status-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>routing-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>firmware-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>manufacturer-service-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-remote</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -136,7 +136,7 @@ tip.wlan.manufacturerServiceBaseUrl=https://localhost:9092
tip.wlan.portalUserServiceBaseUrl=https://localhost:9092
tip.wlan.fileStoreDirectory=/tmp/tip-wlan-filestore
tip.wlan.externalFileStoreURL=localhost:9096
tip.wlan.externalFileStoreURL=https://localhost:9092
#server.session-timeout= # session timeout in seconds
#server.tomcat.max-threads = 0 # number of threads in protocol handler

View File

@@ -63,7 +63,7 @@
<logger name="com.vmware.ovsdb.service.OvsdbConnectionInfo" level="OFF"/>
<logger name="com.vmware.ovsdb.netty.OvsdbConnectionHandler" level="ERROR"/>
<logger name="MQTT_DATA" level="DEBUG"/>
<logger name="MQTT_DATA" level="INFO"/>
<!--
<logger name="org.springframework.security.web.authentication.preauth" level="DEBUG"/>

View File

@@ -3,7 +3,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>opensync-gateway-static-docker</artifactId>
@@ -22,7 +22,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>opensync-gateway-static-process</artifactId>
<version>0.0.1-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>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>opensync-gateway-static-process</artifactId>
@@ -18,7 +18,7 @@
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>opensync-ext-static</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -5,7 +5,7 @@
<parent>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>tip-wlan-cloud-root-pom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<relativePath>../../wlan-cloud-root</relativePath>
</parent>
<artifactId>opensync-gateway</artifactId>
@@ -16,22 +16,22 @@
<dependency>
<artifactId>base-container</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.telecominfraproject.wlan</groupId>
<artifactId>opensync-ext-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>client-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>customer-models</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.vmware.ovsdb</groupId>
@@ -49,13 +49,13 @@
<dependency>
<artifactId>service-metric-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<artifactId>status-service-interface</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>0.0.1-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util -->
@@ -72,7 +72,33 @@
</dependency>
<!-- MQTT dependencies END -->
<!-- Test Dependencies BEGIN -->
<dependency>
<artifactId>status-service-local</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>status-service</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>status-datastore-inmemory</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>cloud-event-dispatcher-empty</artifactId>
<groupId>com.telecominfraproject.wlan</groupId>
<version>1.2.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<!-- Test Dependencies END -->
</dependencies>
</project>

View File

@@ -1,3 +1,4 @@
package com.telecominfraproject.wlan.opensync.mqtt;
import java.nio.charset.Charset;
@@ -5,7 +6,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.fusesource.mqtt.client.FutureConnection;
import org.fusesource.mqtt.client.BlockingConnection;
import org.fusesource.mqtt.client.MQTT;
import org.fusesource.mqtt.client.Message;
import org.fusesource.mqtt.client.QoS;
@@ -20,18 +21,23 @@ import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;
import com.google.protobuf.Descriptors;
import com.google.protobuf.MessageOrBuilder;
import com.google.protobuf.TypeRegistry;
import com.google.protobuf.util.JsonFormat;
import com.google.protobuf.util.JsonFormat.TypeRegistry;
import com.netflix.servo.DefaultMonitorRegistry;
import com.netflix.servo.monitor.BasicCounter;
import com.netflix.servo.monitor.BasicTimer;
import com.netflix.servo.monitor.Counter;
import com.netflix.servo.monitor.MonitorConfig;
import com.netflix.servo.monitor.Stopwatch;
import com.netflix.servo.monitor.Timer;
import com.netflix.servo.tag.TagList;
import com.telecominfraproject.wlan.cloudmetrics.CloudMetricsTags;
import com.telecominfraproject.wlan.opensync.external.integration.OpensyncExternalIntegrationInterface;
import com.telecominfraproject.wlan.opensync.external.integration.utils.StatsPublisherInterface;
import com.telecominfraproject.wlan.opensync.util.ZlibUtil;
import sts.OpensyncStats;
import sts.OpensyncStats.Report;
import traffic.NetworkMetadata;
import traffic.NetworkMetadata.FlowReport;
import wc.stats.IpDnsTelemetry;
import wc.stats.IpDnsTelemetry.WCStatsReport;
@Profile("mqtt_receiver")
@Component
@@ -43,8 +49,25 @@ public class OpensyncMqttClient implements ApplicationListener<ContextClosedEven
public static Charset utf8 = Charset.forName("UTF-8");
private final TagList tags = CloudMetricsTags.commonTags;
private final Counter messagesReceived = new BasicCounter(MonitorConfig.builder("osgw-mqtt-messagesReceived").withTags(tags).build());
private final Counter messageBytesReceived = new BasicCounter(MonitorConfig.builder("osgw-mqtt-messageBytesReceived").withTags(tags).build());
private final Timer timerMessageProcess = new BasicTimer(MonitorConfig.builder("osgw-mqtt-messageProcessTimer").withTags(tags).build());
@Autowired
private OpensyncExternalIntegrationInterface extIntegrationInterface;
private OpensyncExternalIntegrationInterface opensyncExternalIntegrationInterface;
// dtop: use anonymous constructor to ensure that the following code always
// get executed,
// even when somebody adds another constructor in here
{
DefaultMonitorRegistry.getInstance().register(messagesReceived);
DefaultMonitorRegistry.getInstance().register(messageBytesReceived);
DefaultMonitorRegistry.getInstance().register(timerMessageProcess);
}
//
// See https://github.com/fusesource/mqtt-client for the docs
@@ -55,8 +78,7 @@ public class OpensyncMqttClient implements ApplicationListener<ContextClosedEven
public OpensyncMqttClient(@Autowired io.netty.handler.ssl.SslContext sslContext,
@Value("${tip.wlan.mqttBroker.address.internal:testportal.123wlan.com}") String mqttBrokerAddress,
@Value("${tip.wlan.mqttBroker.listenPort:1883}") int mqttBrokerListenPort,
@Value("${tip.wlan.mqttBroker.user:admin}") String username,
@Value("${tip.wlan.mqttBroker.listenPort:1883}") int mqttBrokerListenPort, @Value("${tip.wlan.mqttBroker.user:admin}") String username,
@Value("${tip.wlan.mqttBroker.password:admin}") String password,
@Value("${mqtt.javax.net.ssl.keyStore:/opt/tip-wlan/certs/client_keystore.jks}") String jdkKeyStoreLocation,
@Value("${mqtt.javax.net.ssl.keyStorePassword:mypassword}") String jdkKeyStorePassword,
@@ -84,9 +106,9 @@ public class OpensyncMqttClient implements ApplicationListener<ContextClosedEven
@Override
public void run() {
while (keepReconnecting) {
FutureConnection futureConnection = null;
BlockingConnection blockingConnection = null;
try {
Thread.sleep(5000);
// Thread.sleep(5000);
// Create a new MQTT connection to the broker.
/*
@@ -114,133 +136,71 @@ public class OpensyncMqttClient implements ApplicationListener<ContextClosedEven
*/
MQTT mqtt = new MQTT();
// mqtt.setHost("tcp://192.168.0.137:61616");
mqtt.setHost("tls://" + mqttBrokerAddress + ":" + mqttBrokerListenPort);
LOG.info("Connecting to MQTT broker at {}", mqtt.getHost());
mqtt.setClientId("opensync_mqtt");
mqtt.setUserName(username);
mqtt.setPassword(password);
// Note: the following does not work with the
// serverContext,
// it has to be the
// clientContext
// mqtt.setSslContext(((JdkSslContext)
// sslContext).context());
// For now we'll rely on regular SSLContext from the JDK
blockingConnection = mqtt.blockingConnection();
blockingConnection.connect();
// TODO: revisit this blocking connection, change it to
// futureConnection
futureConnection = mqtt.futureConnection();
futureConnection.connect();
LOG.debug("Connected to MQTT broker at {}", mqtt.getHost());
LOG.info("Connected to MQTT broker at {}", mqtt.getHost());
// NB. setting to AT_MOST_ONCE to match the APs message level
Topic[] topics = {new Topic("/ap/#", QoS.AT_MOST_ONCE),};
// Subscribe to topics:
//
// new Topic("mqtt/example/publish", QoS.AT_LEAST_ONCE),
// new Topic("#", QoS.AT_LEAST_ONCE),
// new Topic("test/#", QoS.EXACTLY_ONCE),
// new Topic("foo/+/bar", QoS.AT_LEAST_ONCE)
Topic[] topics = { new Topic("#", QoS.AT_LEAST_ONCE), };
futureConnection.subscribe(topics);
blockingConnection.subscribe(topics);
LOG.info("Subscribed to mqtt topics {}", Arrays.asList(topics));
// prepare a JSONPrinter to format protobuf messages as
// json
List<Descriptors.Descriptor> protobufDescriptors = new ArrayList<>();
protobufDescriptors.addAll(OpensyncStats.getDescriptor().getMessageTypes());
protobufDescriptors.addAll(IpDnsTelemetry.getDescriptor().getMessageTypes());
protobufDescriptors.addAll(NetworkMetadata.getDescriptor().getMessageTypes());
TypeRegistry oldRegistry = TypeRegistry.newBuilder().add(protobufDescriptors).build();
JsonFormat.Printer jsonPrinter = JsonFormat.printer().includingDefaultValueFields()
.omittingInsignificantWhitespace().usingTypeRegistry(oldRegistry);
JsonFormat.Printer jsonPrinter =
JsonFormat.printer().includingDefaultValueFields().omittingInsignificantWhitespace().usingTypeRegistry(oldRegistry);
// main loop - receive messages
while (true) {
Message mqttMsg = futureConnection.receive().await();
LOG.debug("{} awaiting mqtt message from broker",mqttClientThread.getName());
Message mqttMsg = blockingConnection.receive();
if (mqttMsg == null) {
if (LOG.isTraceEnabled())
LOG.trace("NULL message received for blocking connection");
continue;
}
LOG.debug("MQTT Topic {}", mqttMsg.getTopic());
byte payload[] = mqttMsg.getPayload();
// we acknowledge right after receive because:
// a. none of the stats messages are so important
// that
// we cannot skip one
// b. if there's some kind of problem with the
// message
// (decoding or processing)
// - we want to move on as quickly as possible and
// not
// let it get stuck in the
// queue
mqttMsg.ack();
LOG.trace("received message on topic {} size {}", mqttMsg.getTopic(), payload.length);
if (payload[0] == 0x78) {
// looks like zlib-compressed data, let's
// decompress
// it before deserializing
payload = ZlibUtil.decompress(payload);
}
// attempt to parse the message as protobuf
MessageOrBuilder encodedMsg = null;
Stopwatch stopwatchTimerMessageProcess = timerMessageProcess.start();
try {
byte payload[] = mqttMsg.getPayload();
messagesReceived.increment();
messageBytesReceived.increment(payload.length);
encodedMsg = Report.parseFrom(payload);
MQTT_LOG.info("topic = {} Report = {}", mqttMsg.getTopic(),
jsonPrinter.print(encodedMsg));
extIntegrationInterface.processMqttMessage(mqttMsg.getTopic(), (Report) encodedMsg);
if (payload[0] == 0x78) {
// looks like zlib-compressed data, let's
// decompress
// it before deserializing
payload = ZlibUtil.decompress(payload);
}
// Only supported protobuf on the TIP opensync APs is Report
Report statsReport = Report.parseFrom(payload);
mqttMsg.ack();
MQTT_LOG.info("Topic {}\n{}", mqttMsg.getTopic(), jsonPrinter.print(statsReport));
opensyncExternalIntegrationInterface.processMqttMessage(mqttMsg.getTopic(), statsReport);
LOG.debug("Dispatched report for topic {} to backend for processing", mqttMsg.getTopic());
} catch (Exception e) {
try {
// not a opensync_stats report, attempt to
// deserialize as network_metadata
encodedMsg = FlowReport.parseFrom(payload);
MQTT_LOG.info("topic = {} FlowReport = {}", mqttMsg.getTopic(),
jsonPrinter.print(encodedMsg));
extIntegrationInterface.processMqttMessage(mqttMsg.getTopic(),
(FlowReport) encodedMsg);
} catch (Exception e1) {
try {
// not a opensync_stats report and not
// network_metadata report, attempt to
// deserialize as WCStatsReport
encodedMsg = WCStatsReport.parseFrom(payload);
MQTT_LOG.info("topic = {} IpDnsTelemetry = {}", mqttMsg.getTopic(),
jsonPrinter.print(encodedMsg));
extIntegrationInterface.processMqttMessage(mqttMsg.getTopic(),
(WCStatsReport) encodedMsg);
} catch (Exception e2) {
String msgStr = new String(mqttMsg.getPayload(), utf8);
MQTT_LOG.info("topic = {} message = {}", mqttMsg.getTopic(), msgStr);
}
}
LOG.error("Exception processing topic for message {}",mqttMsg, e);
} finally {
stopwatchTimerMessageProcess.stop();
}
}
} catch (Exception e) {
} catch (Throwable e) {
LOG.error("Exception in MQTT receiver", e);
} finally {
try {
if (futureConnection != null) {
futureConnection.disconnect();
if (blockingConnection != null) {
blockingConnection.disconnect();
}
} catch (Exception e1) {
// do nothing
@@ -266,4 +226,5 @@ public class OpensyncMqttClient implements ApplicationListener<ContextClosedEven
mqttClientThread.interrupt();
}
}
}

View File

@@ -1,13 +1,24 @@
package com.telecominfraproject.wlan.opensync.ovsdb;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.servo.DefaultMonitorRegistry;
import com.netflix.servo.monitor.BasicCounter;
import com.netflix.servo.monitor.Counter;
import com.netflix.servo.monitor.MonitorConfig;
import com.netflix.servo.monitor.NumberGauge;
import com.netflix.servo.tag.TagList;
import com.telecominfraproject.wlan.cloudmetrics.CloudMetricsTags;
import com.vmware.ovsdb.service.OvsdbPassiveConnectionListener;
import com.vmware.ovsdb.service.impl.OvsdbPassiveConnectionListenerImpl;
@@ -16,12 +27,68 @@ public class OvsdbListenerConfig {
private static final Logger LOG = LoggerFactory.getLogger(OvsdbListenerConfig.class);
private final TagList tags = CloudMetricsTags.commonTags;
final Counter rejectedTasks = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-rejectedTasks").withTags(tags).build());
final Counter submittedTasks = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-submittedTasks").withTags(tags).build());
final Counter completedTasks = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-completedTasks").withTags(tags).build());
private AtomicInteger tasksInFlight = new AtomicInteger(0);
private final NumberGauge tasksInFlightGauge = new NumberGauge(
MonitorConfig.builder("osgw-ovsdb-tasksInFlight").withTags(tags).build(), tasksInFlight);
// dtop: use anonymous constructor to ensure that the following code always
// get executed,
// even when somebody adds another constructor in here
{
DefaultMonitorRegistry.getInstance().register(rejectedTasks);
DefaultMonitorRegistry.getInstance().register(submittedTasks);
DefaultMonitorRegistry.getInstance().register(completedTasks);
DefaultMonitorRegistry.getInstance().register(tasksInFlightGauge);
}
@Bean
public OvsdbPassiveConnectionListener ovsdbPassiveConnectionListener(
@org.springframework.beans.factory.annotation.Value("${tip.wlan.ovsdb.listener.threadPoolSize:10}")
int threadPoolSize) {
LOG.debug("Configuring OvsdbPassiveConnectionListener with thread pool size {}", threadPoolSize);
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(threadPoolSize);
ThreadFactory threadFactory = new ThreadFactory() {
private AtomicInteger thrNum = new AtomicInteger();
@Override
public Thread newThread(Runnable r) {
Thread thr = new Thread(r, "ovsdb-exec-pool-" + thrNum.incrementAndGet());
thr.setDaemon(true);
return thr;
}
};
RejectedExecutionHandler rejectedExecHandler = new ThreadPoolExecutor.AbortPolicy() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
rejectedTasks.increment();
super.rejectedExecution(r, executor);
}
};
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(threadPoolSize, threadFactory, rejectedExecHandler) {
@Override
protected void beforeExecute(Thread t, Runnable r) {
submittedTasks.increment();
tasksInFlight.incrementAndGet();
super.beforeExecute(t, r);
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
completedTasks.increment();
tasksInFlight.decrementAndGet();
super.afterExecute(r, t);
}
};
OvsdbPassiveConnectionListener listener = new OvsdbPassiveConnectionListenerImpl(executorService);
return listener;
}

View File

@@ -1,14 +1,21 @@
package com.telecominfraproject.wlan.opensync.ovsdb;
import java.util.HashSet;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.netflix.servo.DefaultMonitorRegistry;
import com.netflix.servo.monitor.MonitorConfig;
import com.netflix.servo.monitor.Monitors;
import com.netflix.servo.monitor.NumberGauge;
import com.netflix.servo.tag.TagList;
import com.telecominfraproject.wlan.cloudmetrics.CloudMetricsTags;
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSession;
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSessionMapInterface;
import com.vmware.ovsdb.service.OvsdbClient;
@@ -17,9 +24,23 @@ import com.vmware.ovsdb.service.OvsdbClient;
public class OvsdbSessionMap implements OvsdbSessionMapInterface {
private static final Logger LOG = LoggerFactory.getLogger(OvsdbSessionMap.class);
private final TagList tags = CloudMetricsTags.commonTags;
private AtomicInteger totalEquipmentConnections = new AtomicInteger(0);
private final NumberGauge totalEquipmentConnectionsGauge = new NumberGauge(
MonitorConfig.builder("osgw-totalEquipmentConnections").withTags(tags).build(), totalEquipmentConnections);
private final ConcurrentHashMap<String, OvsdbSession> connectedClients = new ConcurrentHashMap<>();
// dtop: use anonymous constructor to ensure that the following code always
// get executed,
// even when somebody adds another constructor in here
{
DefaultMonitorRegistry.getInstance().register(totalEquipmentConnectionsGauge);
}
@Override
public OvsdbSession getSession(String apId) {
LOG.info("Get session for AP {}", apId);
@@ -29,7 +50,11 @@ public class OvsdbSessionMap implements OvsdbSessionMapInterface {
@Override
public OvsdbSession removeSession(String apId) {
LOG.info("Removing session for AP {}", apId);
return connectedClients.remove(apId);
OvsdbSession ret = connectedClients.remove(apId);
if(ret!=null) {
totalEquipmentConnections.decrementAndGet();
}
return ret;
}
@Override
@@ -37,7 +62,7 @@ public class OvsdbSessionMap implements OvsdbSessionMapInterface {
try {
LOG.info("Close session for AP {}", apId);
connectedClients.get(apId).getOvsdbClient().shutdown();
connectedClients.remove(apId);
removeSession(apId);
LOG.info("Closed ovsdb session for {}", apId);
}catch (Exception e) {
// do nothing
@@ -58,6 +83,8 @@ public class OvsdbSessionMap implements OvsdbSessionMapInterface {
}catch (Exception e) {
// do nothing
}
} else {
totalEquipmentConnections.incrementAndGet();
}
LOG.info("Created new ovsdb session for {}", apId);

View File

@@ -1,8 +1,16 @@
package com.telecominfraproject.wlan.opensync.ovsdb;
import com.google.common.collect.ImmutableMap;
import com.netflix.servo.DefaultMonitorRegistry;
import com.netflix.servo.monitor.BasicCounter;
import com.netflix.servo.monitor.Counter;
import com.netflix.servo.monitor.MonitorConfig;
import com.netflix.servo.tag.TagList;
import com.telecominfraproject.wlan.cloudmetrics.CloudMetricsTags;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes;
import com.telecominfraproject.wlan.opensync.external.integration.OpensyncExternalIntegrationInterface;
import com.telecominfraproject.wlan.opensync.external.integration.OpensyncExternalIntegrationInterface.RowUpdateOperation;
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbClientInterface;
@@ -10,13 +18,17 @@ import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSession;
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSessionMapInterface;
import com.telecominfraproject.wlan.opensync.external.integration.models.*;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDao;
import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbClientWithMetrics;
import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbMetrics;
import com.telecominfraproject.wlan.opensync.util.OvsdbStringConstants;
import com.telecominfraproject.wlan.opensync.util.SslUtil;
import com.vmware.ovsdb.callback.ConnectionCallback;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.methods.*;
import com.vmware.ovsdb.protocol.operation.notation.Row;
import com.vmware.ovsdb.protocol.operation.notation.Value;
import com.vmware.ovsdb.service.OvsdbClient;
import com.vmware.ovsdb.service.OvsdbConnectionInfo;
import com.vmware.ovsdb.service.OvsdbPassiveConnectionListener;
import io.netty.handler.ssl.SslContext;
import org.slf4j.Logger;
@@ -26,9 +38,11 @@ import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@Profile("ovsdb_manager")
@Component
@@ -36,6 +50,16 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
private static final Logger LOG = LoggerFactory.getLogger(TipWlanOvsdbClient.class);
private final TagList tags = CloudMetricsTags.commonTags;
private final Counter connectionsAttempted = new BasicCounter(MonitorConfig.builder("osgw-connectionsAttempted").withTags(tags).build());
private final Counter connectionsFailed = new BasicCounter(MonitorConfig.builder("osgw-connectionsFailed").withTags(tags).build());
private final Counter connectionsCreated = new BasicCounter(MonitorConfig.builder("osgw-connectionsCreated").withTags(tags).build());
private final Counter connectionsDropped = new BasicCounter(MonitorConfig.builder("osgw-connectionsDropped").withTags(tags).build());
@org.springframework.beans.factory.annotation.Value("${tip.wlan.ovsdb.listenPort:6640}")
private int ovsdbListenPort;
@@ -63,9 +87,22 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
@Autowired
private OvsdbSessionMapInterface ovsdbSessionMapInterface;
@Autowired
private OvsdbMetrics ovsdbMetrics;
@org.springframework.beans.factory.annotation.Value("${tip.wlan.manager.collectionIntervalSec.event:60}")
private long collectionIntervalSecEvent;
// dtop: use anonymous constructor to ensure that the following code always
// get executed,
// even when somebody adds another constructor in here
{
DefaultMonitorRegistry.getInstance().register(connectionsAttempted);
DefaultMonitorRegistry.getInstance().register(connectionsCreated);
DefaultMonitorRegistry.getInstance().register(connectionsDropped);
DefaultMonitorRegistry.getInstance().register(connectionsFailed);
}
@PostConstruct
private void postCreate() {
listenForConnections();
@@ -77,13 +114,25 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
@Override
public void connected(OvsdbClient ovsdbClient) {
String remoteHost = ovsdbClient.getConnectionInfo().getRemoteAddress().getHostAddress();
int localPort = ovsdbClient.getConnectionInfo().getLocalPort();
connectionsAttempted.increment();
if (!(ovsdbClient instanceof OvsdbClientWithMetrics)) {
ovsdbClient = new OvsdbClientWithMetrics(ovsdbClient, ovsdbMetrics);
}
String subjectDn;
try {
subjectDn = ((X509Certificate) ovsdbClient.getConnectionInfo().getRemoteCertificate())
.getSubjectDN().getName();
OvsdbConnectionInfo connectionInfo = ovsdbClient.getConnectionInfo();
String remoteHost = connectionInfo.getRemoteAddress().getHostAddress();
Certificate remoteCertificate = connectionInfo.getRemoteCertificate();
if (remoteCertificate == null) {
LOG.debug("Connect attempt no certificate from {} on remote port {}", remoteHost, connectionInfo.getRemotePort());
return;
}
int localPort = connectionInfo.getLocalPort();
subjectDn = ((X509Certificate) remoteCertificate).getSubjectDN().getName();
String clientCn = SslUtil.extractCN(subjectDn);
LOG.info("ovsdbClient connecting from {} on port {} clientCn {}", remoteHost, localPort, clientCn);
@@ -102,14 +151,17 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
monitorOvsdbStateTables(ovsdbClient, key);
connectionsCreated.increment();
LOG.info("ovsdbClient connected from {} on port {} AP {} ", remoteHost, localPort, key);
LOG.info("ovsdbClient connectedClients = {}", ovsdbSessionMapInterface.getNumSessions());
} catch (IllegalStateException e) {
connectionsFailed.increment();
LOG.error("autoprovisioning error {}", e.getMessage(), e);
// something is wrong with the SSL
ovsdbClient.shutdown();
} catch (Exception e) {
connectionsFailed.increment();
LOG.error("ovsdbClient error", e);
// something is wrong with the SSL
ovsdbClient.shutdown();
@@ -120,6 +172,8 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
@Override
public void disconnected(OvsdbClient ovsdbClient) {
connectionsDropped.increment();
String remoteHost;
int localPort;
String clientCn;
@@ -139,8 +193,9 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
localPort = ovsdbClient.getConnectionInfo().getLocalPort();
String subjectDn = null;
try {
subjectDn = ((X509Certificate) ovsdbClient.getConnectionInfo().getRemoteCertificate())
.getSubjectDN().getName();
Certificate remoteCertificate = ovsdbClient.getConnectionInfo().getRemoteCertificate();
if (remoteCertificate != null)
subjectDn = ((X509Certificate) remoteCertificate).getSubjectDN().getName();
} catch (Exception e) {
// do nothing
}
@@ -151,18 +206,16 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
extIntegrationInterface.apDisconnected(key);
ovsdbSessionMapInterface.removeSession(key);
} catch (Exception e) {
LOG.debug("Unable to process ap disconnect. {}", e.getMessage());
LOG.debug("Unable to process ap disconnect. {}", e);
}
}
LOG.info("ovsdbClient disconnected from {} on port {} clientCn {} AP {} ", remoteHost, localPort,
clientCn, key);
LOG.info("ovsdbClient disconnected from {} on port {} clientCn {} AP {} ", remoteHost, localPort, clientCn, key);
LOG.info("ovsdbClient connectedClients = {}", ovsdbSessionMapInterface.getNumSessions());
} finally {
try {
ovsdbClient.shutdown();
} catch (Exception e) {
LOG.error("Caught Exception shutting down ovsdb client, may have already been disconnected",
e);
LOG.error("Caught Exception shutting down ovsdb client, may have already been disconnected", e);
}
}
@@ -176,34 +229,36 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
LOG.info("Manager waiting for connection on port {}...", ovsdbListenPort);
}
private void processConnectRequest(OvsdbClient ovsdbClient, String clientCn,
ConnectNodeInfo connectNodeInfo) {
private void processConnectRequest(OvsdbClient ovsdbClient, String clientCn, ConnectNodeInfo connectNodeInfo) {
LOG.debug("Starting Client connect");
connectNodeInfo = ovsdbDao.updateConnectNodeInfoOnConnect(ovsdbClient, clientCn, connectNodeInfo,
preventClientCnAlteration);
connectNodeInfo = ovsdbDao.updateConnectNodeInfoOnConnect(ovsdbClient, clientCn, connectNodeInfo, preventClientCnAlteration);
// successfully connected - register it in our
// connectedClients table
String apId = alterClientCnIfRequired(clientCn, connectNodeInfo);
LOG.debug("Client {} connect for AP {}", clientCn, apId);
OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
ovsdbDao.removeAllSsids(ovsdbClient); // always
ovsdbDao.removeAllInetConfigs(ovsdbClient);
ovsdbDao.resetWiredPorts(ovsdbClient, opensyncAPConfig);
ovsdbDao.removeWifiRrm(ovsdbClient);
ovsdbDao.removeRadsecRadiusAndRealmConfigs(ovsdbClient);
ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always
extIntegrationInterface.clearEquipmentStatus(apId);
OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
if (opensyncAPConfig != null) {
ovsdbDao.configureNtpServer(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureNode(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig);
ovsdbDao.createVlanNetworkInterfaces(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWiredPort(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureRadsecRadiusAndRealm(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig);
if (opensyncAPConfig.getHotspotConfig() != null) {
ovsdbDao.configureHotspots(ovsdbClient, opensyncAPConfig);
@@ -216,6 +271,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) {
ovsdbDao.updateDeviceStatsReportingInterval(ovsdbClient, collectionIntervalSecDeviceStats);
}
ovsdbDao.enableNetworkProbeForSyntheticClient(ovsdbClient);
ovsdbDao.updateEventReportingInterval(ovsdbClient, collectionIntervalSecEvent);
} else {
@@ -245,6 +301,15 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
return ovsdbDao.changeRedirectorAddress(ovsdbSession.getOvsdbClient(), apId, newRedirectorAddress);
}
public String processBlinkRequest(String apId, boolean blinkAllLEDs) {
OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(apId);
if (ovsdbSession == null) {
throw new IllegalStateException("AP with id " + apId + " is not connected");
}
return ovsdbDao.processBlinkRequest(ovsdbSession.getOvsdbClient(), apId, blinkAllLEDs);
}
@Override
public void processConfigChanged(String apId) {
LOG.debug("Starting processConfigChanged for {}", apId);
@@ -265,14 +330,19 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
ovsdbDao.removeAllSsids(ovsdbClient); // always
ovsdbDao.removeAllInetConfigs(ovsdbClient);
ovsdbDao.resetWiredPorts(ovsdbClient, opensyncAPConfig); // need to run this first before remove Status
ovsdbDao.removeWifiRrm(ovsdbClient);
ovsdbDao.removeRadsecRadiusAndRealmConfigs(ovsdbClient);
ovsdbDao.removeAllStatsConfigs(ovsdbClient);
extIntegrationInterface.clearEquipmentStatus(apId);
ovsdbDao.configureNtpServer(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureNode(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig);
ovsdbDao.createVlanNetworkInterfaces(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWiredPort(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureRadsecRadiusAndRealm(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig);
if (opensyncAPConfig.getHotspotConfig() != null) {
ovsdbDao.configureHotspots(ovsdbClient, opensyncAPConfig);
@@ -280,8 +350,15 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
ovsdbDao.configureInterfaces(ovsdbClient);
ovsdbDao.configureWifiRadios(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureStatsFromProfile(ovsdbClient, opensyncAPConfig);
if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) {
ovsdbDao.updateDeviceStatsReportingInterval(ovsdbClient, collectionIntervalSecDeviceStats);
}
ovsdbDao.enableNetworkProbeForSyntheticClient(ovsdbClient);
ovsdbDao.updateEventReportingInterval(ovsdbClient, collectionIntervalSecEvent);
LOG.debug("Finished processConfigChanged for {}", apId);
}
@Override
@@ -315,20 +392,20 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
} catch (OvsdbClientException e) {
LOG.debug("Could not enable monitor for Wifi_Radio_State table. {}", e.getMessage());
}
try {
monitorWifiInetStateDbTable(ovsdbClient, key);
} catch (OvsdbClientException e) {
LOG.debug("Could not enable monitor for Wifi_Inet_State table. {}", e.getMessage());
}
try {
monitorWifiVifStateDbTable(ovsdbClient, key);
} catch (OvsdbClientException e) {
LOG.debug("Could not enable monitor for Wifi_VIF_State table. {}", e.getMessage());
}
try {
monitorWifiAssociatedClientsDbTable(ovsdbClient, key);
} catch (OvsdbClientException e) {
@@ -341,7 +418,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
LOG.debug("Could not enable monitor for AWLAN_Node table. {}", e.getMessage());
}
try {
monitorDhcpLeasedIpDbTable(ovsdbClient, key);
} catch (OvsdbClientException e) {
@@ -355,25 +432,30 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
LOG.debug("Could not enable monitor for Command_State table. {}", e.getMessage());
}
try {
monitorNodeStateTable(ovsdbClient,key);
monitorNodeStateTable(ovsdbClient, key);
} catch (OvsdbClientException e) {
LOG.debug("Could not enable monitor for Node_State table. {}", e.getMessage());
}
try {
if (ovsdbClient.getSchema(OvsdbDao.ovsdbName).get().getTables().containsKey("APC_State")) {
monitorAPCStateTable(ovsdbClient, key);
}
} catch (InterruptedException | ExecutionException | OvsdbClientException e) {
LOG.debug("Could not enable monitor for APC_State table. {}", e);
}
LOG.debug("Finished (re)setting monitors for AP {}", key);
}
private void monitorDhcpLeasedIpDbTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
CompletableFuture<TableUpdates> awCf = ovsdbClient.monitor(OvsdbDao.ovsdbName,
OvsdbDao.dhcpLeasedIpDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.dhcpLeasedIpDbTable,
new MonitorRequest(new MonitorSelect(true, true, true, true)))),
CompletableFuture<TableUpdates> awCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.dhcpLeasedIpDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.dhcpLeasedIpDbTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))),
tableUpdates -> {
try {
LOG.info(OvsdbDao.dhcpLeasedIpDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
LOG.info(OvsdbDao.dhcpLeasedIpDbTable + "_" + key + " monitor callback received {}", tableUpdates);
List<Map<String, String>> insert = new ArrayList<>();
List<Map<String, String>> delete = new ArrayList<>();
@@ -411,19 +493,16 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
}
if (!insert.isEmpty()) {
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(insert, key,
RowUpdateOperation.INSERT);
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(insert, key, RowUpdateOperation.INSERT);
}
if (!delete.isEmpty()) {
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(delete, key,
RowUpdateOperation.DELETE);
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(delete, key, RowUpdateOperation.DELETE);
}
if (!update.isEmpty()) {
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(update, key,
RowUpdateOperation.MODIFY);
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(update, key, RowUpdateOperation.MODIFY);
}
} catch (Exception e) {
@@ -438,13 +517,10 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
private void monitorCommandStateDbTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
CompletableFuture<TableUpdates> csCf = ovsdbClient.monitor(OvsdbDao.ovsdbName,
OvsdbDao.commandStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.commandStateDbTable, new MonitorRequest())),
tableUpdates -> {
CompletableFuture<TableUpdates> csCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.commandStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.commandStateDbTable, new MonitorRequest())), tableUpdates -> {
try {
LOG.info(OvsdbDao.commandStateDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
LOG.info(OvsdbDao.commandStateDbTable + "_" + key + " monitor callback received {}", tableUpdates);
List<Map<String, String>> insert = new ArrayList<>();
List<Map<String, String>> delete = new ArrayList<>();
@@ -482,19 +558,16 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
}
if (!insert.isEmpty()) {
extIntegrationInterface.commandStateDbTableUpdate(insert, key,
RowUpdateOperation.INSERT);
extIntegrationInterface.commandStateDbTableUpdate(insert, key, RowUpdateOperation.INSERT);
}
if (!delete.isEmpty()) {
extIntegrationInterface.commandStateDbTableUpdate(delete, key,
RowUpdateOperation.DELETE);
extIntegrationInterface.commandStateDbTableUpdate(delete, key, RowUpdateOperation.DELETE);
}
if (!update.isEmpty()) {
extIntegrationInterface.commandStateDbTableUpdate(update, key,
RowUpdateOperation.MODIFY);
extIntegrationInterface.commandStateDbTableUpdate(update, key, RowUpdateOperation.MODIFY);
}
} catch (Exception e) {
@@ -508,35 +581,27 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
}
private void monitorAwlanNodeDbTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
CompletableFuture<TableUpdates> awCf = ovsdbClient.monitor(
OvsdbDao.ovsdbName, OvsdbDao.awlanNodeDbTable + "_" + key, new MonitorRequests(ImmutableMap
.of(OvsdbDao.awlanNodeDbTable, new MonitorRequest(new MonitorSelect(true, false, false, true)))),
CompletableFuture<TableUpdates> awCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.awlanNodeDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.awlanNodeDbTable, new MonitorRequest(new MonitorSelect(true, false, false, true)))),
tableUpdates -> {
try {
LOG.info(OvsdbDao.awlanNodeDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
LOG.info(OvsdbDao.awlanNodeDbTable + "_" + key + " monitor callback received {}", tableUpdates);
extIntegrationInterface.awlanNodeDbTableUpdate(
ovsdbDao.getOpensyncAWLANNode(tableUpdates, key, ovsdbClient), key);
extIntegrationInterface.awlanNodeDbTableUpdate(ovsdbDao.getOpensyncAWLANNode(tableUpdates, key, ovsdbClient), key);
} catch (Exception e) {
LOG.error("awlanNodeDbTableUpdate failed", e);
}
});
extIntegrationInterface.awlanNodeDbTableUpdate(ovsdbDao.getOpensyncAWLANNode(awCf.join(), key, ovsdbClient),
key);
extIntegrationInterface.awlanNodeDbTableUpdate(ovsdbDao.getOpensyncAWLANNode(awCf.join(), key, ovsdbClient), key);
}
private void monitorWifiAssociatedClientsDbTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
CompletableFuture<TableUpdates> acCf = ovsdbClient.monitor(OvsdbDao.ovsdbName,
OvsdbDao.wifiAssociatedClientsDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiAssociatedClientsDbTable, new MonitorRequest())),
tableUpdates -> {
CompletableFuture<TableUpdates> acCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiAssociatedClientsDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiAssociatedClientsDbTable, new MonitorRequest())), tableUpdates -> {
try {
LOG.info(
OvsdbDao.wifiAssociatedClientsDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
LOG.info(OvsdbDao.wifiAssociatedClientsDbTable + "_" + key + " monitor callback received {}", tableUpdates);
List<OpensyncWifiAssociatedClients> associatedClients = new ArrayList<>();
@@ -551,11 +616,9 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
// the updates, as we want to delete
// before
// adding anyway.
extIntegrationInterface.wifiAssociatedClientsDbTableDelete(deletedClientMac,
key);
extIntegrationInterface.wifiAssociatedClientsDbTableDelete(deletedClientMac, key);
} else {
associatedClients.addAll(
ovsdbDao.getOpensyncWifiAssociatedClients(rowUpdate, key, ovsdbClient));
associatedClients.addAll(ovsdbDao.getOpensyncWifiAssociatedClients(rowUpdate, key, ovsdbClient));
}
}
@@ -569,16 +632,13 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
});
extIntegrationInterface.wifiAssociatedClientsDbTableUpdate(
ovsdbDao.getInitialOpensyncWifiAssociatedClients(acCf.join(), key, ovsdbClient), key);
extIntegrationInterface.wifiAssociatedClientsDbTableUpdate(ovsdbDao.getInitialOpensyncWifiAssociatedClients(acCf.join(), key, ovsdbClient), key);
}
private void monitorWifiInetStateDbTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
CompletableFuture<TableUpdates> isCf = ovsdbClient.monitor(OvsdbDao.ovsdbName,
OvsdbDao.wifiInetStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiInetStateDbTable,
new MonitorRequest(new MonitorSelect(true, true, true, true)))),
CompletableFuture<TableUpdates> isCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiInetStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiInetStateDbTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))),
tableUpdates -> {
try {
LOG.info(OvsdbDao.wifiInetStateDbTable + "_" + key + " monitor callback received {}", tableUpdates);
@@ -587,22 +647,20 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
List<OpensyncAPInetState> inetStateDelete = new ArrayList<>();
for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
if (rowUpdate.getNew() == null) {
inetStateDelete.addAll(ovsdbDao.getOpensyncApInetStateForRowUpdate(rowUpdate,
key, ovsdbClient));
inetStateDelete.addAll(ovsdbDao.getOpensyncApInetStateForRowUpdate(rowUpdate, key, ovsdbClient));
} else {
inetStateInsertOrUpdate.addAll(ovsdbDao
.getOpensyncApInetStateForRowUpdate(rowUpdate, key, ovsdbClient));
inetStateInsertOrUpdate.addAll(ovsdbDao.getOpensyncApInetStateForRowUpdate(rowUpdate, key, ovsdbClient));
}
}
}
// delete first
extIntegrationInterface.wifiInetStateDbTableUpdate(inetStateDelete, key);
extIntegrationInterface.wifiInetStateDbTableDelete(inetStateDelete, key);
// now process updates and mutations
extIntegrationInterface.wifiInetStateDbTableUpdate(inetStateInsertOrUpdate, key);
@@ -612,103 +670,129 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
});
extIntegrationInterface.wifiInetStateDbTableUpdate(
ovsdbDao.getInitialOpensyncApInetStateForRowUpdate(isCf.join(), key, ovsdbClient), key);
extIntegrationInterface.wifiInetStateDbTableUpdate(ovsdbDao.getInitialOpensyncApInetStateForRowUpdate(isCf.join(), key, ovsdbClient), key);
}
private void monitorWifiRadioStateDbTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
CompletableFuture<TableUpdates> rsCf = ovsdbClient.monitor(OvsdbDao.ovsdbName,
OvsdbDao.wifiRadioStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiRadioStateDbTable,
new MonitorRequest(new MonitorSelect(true, false, false, true)))),
CompletableFuture<TableUpdates> rsCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiRadioStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiRadioStateDbTable, new MonitorRequest(new MonitorSelect(true, false, false, true)))),
tableUpdates -> {
try {
LOG.info(OvsdbDao.wifiRadioStateDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
LOG.info(OvsdbDao.wifiRadioStateDbTable + "_" + key + " monitor callback received {}", tableUpdates);
extIntegrationInterface.wifiRadioStatusDbTableUpdate(
ovsdbDao.getOpensyncAPRadioState(tableUpdates, key, ovsdbClient), key);
extIntegrationInterface.wifiRadioStatusDbTableUpdate(ovsdbDao.getOpensyncAPRadioState(tableUpdates, key, ovsdbClient), key);
} catch (Exception e) {
LOG.error("wifiRadioStatusDbTableUpdate failed", e);
}
});
extIntegrationInterface
.wifiRadioStatusDbTableUpdate(ovsdbDao.getOpensyncAPRadioState(rsCf.join(), key, ovsdbClient), key);
extIntegrationInterface.wifiRadioStatusDbTableUpdate(ovsdbDao.getOpensyncAPRadioState(rsCf.join(), key, ovsdbClient), key);
}
private void monitorWifiVifStateDbTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
CompletableFuture<TableUpdates> vsCf = ovsdbClient
.monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiVifStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiVifStateDbTable,
new MonitorRequest(new MonitorSelect(false, true, true, true)))),
tableUpdates -> {
try {
LOG.info(OvsdbDao.wifiVifStateDbTable + "_" + key + " monitor callback received {}",
tableUpdates);
CompletableFuture<TableUpdates> vsCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiVifStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiVifStateDbTable, new MonitorRequest(new MonitorSelect(false, true, true, true)))),
tableUpdates -> {
try {
LOG.info(OvsdbDao.wifiVifStateDbTable + "_" + key + " monitor callback received {}", tableUpdates);
List<OpensyncAPVIFState> vifsToDelete = new ArrayList<>();
List<OpensyncAPVIFState> vifsToInsertOrUpdate = new ArrayList<>();
for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
List<OpensyncAPVIFState> vifsToDelete = new ArrayList<>();
List<OpensyncAPVIFState> vifsToInsertOrUpdate = new ArrayList<>();
for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
if (rowUpdate.getNew() == null) {
// this is a deletion
vifsToDelete.addAll(ovsdbDao.getOpensyncApVifStateForRowUpdate(
rowUpdate, key, ovsdbClient));
if (rowUpdate.getNew() == null) {
// this is a deletion
vifsToDelete.addAll(ovsdbDao.getOpensyncApVifStateForRowUpdate(rowUpdate, key, ovsdbClient));
} else {
// either an insert or
// mutuate/update
vifsToInsertOrUpdate.addAll(ovsdbDao.getOpensyncApVifStateForRowUpdate(
rowUpdate, key, ovsdbClient));
}
}
// delete first, if required
if (!vifsToDelete.isEmpty()) {
extIntegrationInterface.wifiVIFStateDbTableDelete(vifsToDelete, key);
}
if (!vifsToInsertOrUpdate.isEmpty()) {
extIntegrationInterface.wifiVIFStateDbTableUpdate(vifsToInsertOrUpdate,
key);
}
} else {
// either an insert or
// mutuate/update
vifsToInsertOrUpdate.addAll(ovsdbDao.getOpensyncApVifStateForRowUpdate(rowUpdate, key, ovsdbClient));
}
} catch (Exception e) {
LOG.error("wifiVIFStateDbTableUpdate failed", e);
}
});
// delete first, if required
if (!vifsToDelete.isEmpty()) {
extIntegrationInterface.wifiVIFStateDbTableDelete(vifsToDelete, key);
}
if (!vifsToInsertOrUpdate.isEmpty()) {
extIntegrationInterface.wifiVIFStateDbTableUpdate(vifsToInsertOrUpdate, key);
}
}
} catch (Exception e) {
LOG.error("wifiVIFStateDbTableUpdate failed", e);
}
});
vsCf.join();
}
private void monitorNodeStateTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
CompletableFuture<TableUpdates> nsCf = ovsdbClient.monitor(
OvsdbDao.ovsdbName, OvsdbDao.nodeStateTable + "_" + key, new MonitorRequests(ImmutableMap
.of(OvsdbDao.nodeStateTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))),
tableUpdates -> {
CompletableFuture<TableUpdates> nsCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.nodeStateTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.nodeStateTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))), tableUpdates -> {
LOG.info(OvsdbDao.nodeStateTable + "_" + key + " monitor callback received {}");
extIntegrationInterface.nodeStateDbTableUpdate(processNodeStateTableUpdate(key, tableUpdates), key);
});
extIntegrationInterface.nodeStateDbTableUpdate(processNodeStateTableUpdate(key, nsCf.join()), key);
}
private List<Map<String,String>> processNodeStateTableUpdate(String key, TableUpdates tableUpdates) {
List<Map<String, String>> updates = new ArrayList<>();
tableUpdates.getTableUpdates().forEach((key1, value) -> {
LOG.info("TableUpdate for {}", key1);
value.getRowUpdates().values().forEach(r -> {
if (r.getOld() != null) {
LOG.info("Node_State old row {}", r.getOld().getColumns());
}
if (r.getNew() != null) {
LOG.info("Node_State new row {}", r.getNew().getColumns());
Map<String, Value> columns = r.getNew().getColumns();
Map<String, String> update = new HashMap<>();
update.put("key", columns.get("key").toString());
update.put("module", columns.get("module").toString());
update.put("persist", columns.get("persist").toString());
update.put("value", columns.get("value").toString());
updates.add(update);
}
});
});
return updates;
}
private void monitorAPCStateTable(OvsdbClient ovsdbClient, String key) throws OvsdbClientException {
CompletableFuture<TableUpdates> nsCf = ovsdbClient.monitor(OvsdbDao.ovsdbName, OvsdbDao.apcStateDbTable + "_" + key,
new MonitorRequests(ImmutableMap.of(OvsdbDao.apcStateDbTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))), tableUpdates -> {
LOG.info(OvsdbDao.apcStateDbTable + "_" + key + " monitor callback received {}");
tableUpdates.getTableUpdates().forEach((key1, value) -> {
LOG.info("TableUpdate for {}", key1);
value.getRowUpdates().values().forEach(r -> {
if (r.getOld() != null) {
LOG.info("Node_State old row {}", r.getOld().getColumns());
}
if (r.getNew() != null) {
LOG.info("Node_State new row {}", r.getNew().getColumns());
}
Map<String, String> apcStateAttributes = ovsdbDao.getAPCState(r, key);
extIntegrationInterface.apcStateDbTableUpdate(apcStateAttributes, key, RowUpdateOperation.MODIFY);
});
});
});
nsCf.join();
try {
extIntegrationInterface.apcStateDbTableUpdate(
ovsdbDao.getAPCState(nsCf.join().getTableUpdates().entrySet().iterator().next().getValue().getRowUpdates().values().iterator().next(), key),
key, RowUpdateOperation.INIT);
} catch (Exception e) {
LOG.error("Could not get INIT state for {}", OvsdbDao.apcStateDbTable, e);
}
}
@Override
@@ -758,8 +842,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
@Override
public String startDebugEngine(String apId, String gatewayHostname, Integer gatewayPort) {
LOG.debug("TipWlanOvsdbClient::startDebugEngine apId {} gatewayHostname {} gatewayPort {}", apId,
gatewayHostname, gatewayPort);
LOG.debug("TipWlanOvsdbClient::startDebugEngine apId {} gatewayHostname {} gatewayPort {}", apId, gatewayHostname, gatewayPort);
try {
OvsdbSession session = ovsdbSessionMapInterface.getSession(apId);
@@ -767,17 +850,14 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
Map<String, String> payload = new HashMap<>();
payload.put("gateway_hostname", gatewayHostname);
payload.put("gateway_port", gatewayPort.toString());
ovsdbDao.configureCommands(ovsdbClient, OvsdbDao.StartDebugEngineApCommand, payload, 0L,
defaultCommandDurationSec);
ovsdbDao.configureCommands(ovsdbClient, OvsdbDao.StartDebugEngineApCommand, payload, 0L, defaultCommandDurationSec);
LOG.debug("Started debug engine on AP {} with gateway {} port {}", apId, gatewayHostname, gatewayPort);
return "Started debug engine on AP " + apId + " with gateway " + gatewayHostname + " port " + gatewayPort;
} catch (Exception e) {
LOG.error(
"TipWlanOvsdbClient::startDebugEngine Failed to start debug engine on AP {} with gateway {} port {}",
apId, gatewayHostname, gatewayPort, e);
return "Failed to start debug engine on AP " + apId + " with gateway " + gatewayHostname + " port "
+ gatewayPort;
LOG.error("TipWlanOvsdbClient::startDebugEngine Failed to start debug engine on AP {} with gateway {} port {}", apId, gatewayHostname, gatewayPort,
e);
return "Failed to start debug engine on AP " + apId + " with gateway " + gatewayHostname + " port " + gatewayPort;
}
}
@@ -822,8 +902,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
}
} catch (Exception e) {
if (switchBanks) {
LOG.debug("TipWlanOvsdbClient::processRebootRequest failed to trigger switch software bank on AP {}",
apId, e);
LOG.debug("TipWlanOvsdbClient::processRebootRequest failed to trigger switch software bank on AP {}", apId, e);
return "failed to trigger switch software bank on AP " + apId;
} else {
LOG.error("TipWlanOvsdbClient::processRebootRequest failed to trigger reboot of AP {}", apId, e);
@@ -869,23 +948,34 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
return key;
}
public String processNewChannelsRequest(String apId, Map<RadioType, Integer> backupChannelMap,
Map<RadioType, Integer> primaryChannelMap) {
public String processNewChannelsRequest(String apId, Map<RadioType, Integer> backupChannelMap, Map<RadioType, Integer> primaryChannelMap) {
LOG.info("TipWlanOvsdbClient::processNewChannelsRequest for AP {}", apId);
try {
OvsdbSession session = ovsdbSessionMapInterface.getSession(apId);
OvsdbClient ovsdbClient = session.getOvsdbClient();
ovsdbDao.processNewChannelsRequest(ovsdbClient, backupChannelMap, primaryChannelMap);
LOG.info("TipWlanOvsdbClient::processNewChannelsRequest change backup and/or primary channels for AP {}",
apId);
LOG.info("TipWlanOvsdbClient::processNewChannelsRequest change backup and/or primary channels for AP {}", apId);
return " change backup and/or primary channels for AP " + apId;
} catch (Exception e) {
LOG.error(
"TipWlanOvsdbClient::processNewChannelsRequest failed to change backup and/or primary channels for AP {}",
apId, e);
LOG.error("TipWlanOvsdbClient::processNewChannelsRequest failed to change backup and/or primary channels for AP {}", apId, e);
return "failed to change backup and/or primary channels for AP " + apId;
}
}
public String processCellSizeAttributesRequest(String apId, Map<RadioType, CellSizeAttributes> cellSizeAttributeMap) {
LOG.info("TipWlanOvsdbClient::processCellSizeAttributesRequest for AP {}", apId);
try {
OvsdbSession session = ovsdbSessionMapInterface.getSession(apId);
OvsdbClient ovsdbClient = session.getOvsdbClient();
ovsdbDao.processCellSizeAttributesRequest(ovsdbClient, cellSizeAttributeMap);
LOG.info("TipWlanOvsdbClient::processCellSizeAttributesRequest change cellSizeAttributes for AP {}", apId);
return " change cell size attributes for AP " + apId;
} catch (Exception e) {
LOG.error("TipWlanOvsdbClient::processCellSizeAttributesRequest failed to change cell size attributes for AP {}", apId, e);
return "failed to change cell size attributes for AP " + apId;
}
}
}

View File

@@ -1,5 +1,6 @@
package com.telecominfraproject.wlan.opensync.ovsdb;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import javax.annotation.PostConstruct;
@@ -10,10 +11,17 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import com.netflix.servo.DefaultMonitorRegistry;
import com.netflix.servo.monitor.BasicCounter;
import com.netflix.servo.monitor.Counter;
import com.netflix.servo.monitor.MonitorConfig;
import com.netflix.servo.tag.TagList;
import com.telecominfraproject.wlan.cloudmetrics.CloudMetricsTags;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDao;
import com.telecominfraproject.wlan.opensync.util.SslUtil;
import com.vmware.ovsdb.callback.ConnectionCallback;
import com.vmware.ovsdb.service.OvsdbClient;
import com.vmware.ovsdb.service.OvsdbConnectionInfo;
import com.vmware.ovsdb.service.OvsdbPassiveConnectionListener;
import io.netty.handler.ssl.SslContext;
@@ -24,6 +32,20 @@ public class TipWlanOvsdbRedirector {
private static final Logger LOG = LoggerFactory.getLogger(TipWlanOvsdbRedirector.class);
private final TagList tags = CloudMetricsTags.commonTags;
private final Counter connectionsAttempted = new BasicCounter(
MonitorConfig.builder("osgw-redirector-connectionsAttempted").withTags(tags).build());
private final Counter connectionsFailed = new BasicCounter(
MonitorConfig.builder("osgw-redirector-connectionsFailed").withTags(tags).build());
private final Counter connectionsCreated = new BasicCounter(
MonitorConfig.builder("osgw-redirector-connectionsCreated").withTags(tags).build());
private final Counter connectionsDropped = new BasicCounter(
MonitorConfig.builder("osgw-redirector-connectionsDropped").withTags(tags).build());
@org.springframework.beans.factory.annotation.Value("${tip.wlan.ovsdb.redirector.listenPort:6643}")
private int ovsdbRedirectorListenPort;
@@ -41,21 +63,41 @@ public class TipWlanOvsdbRedirector {
listenForConnections();
}
// dtop: use anonymous constructor to ensure that the following code always
// get executed,
// even when somebody adds another constructor in here
{
DefaultMonitorRegistry.getInstance().register(connectionsAttempted);
DefaultMonitorRegistry.getInstance().register(connectionsCreated);
DefaultMonitorRegistry.getInstance().register(connectionsDropped);
DefaultMonitorRegistry.getInstance().register(connectionsFailed);
}
public void listenForConnections() {
ConnectionCallback connectionCallback = new ConnectionCallback() {
public void connected(OvsdbClient ovsdbClient) {
String remoteHost = ovsdbClient.getConnectionInfo().getRemoteAddress().getHostAddress();
int localPort = ovsdbClient.getConnectionInfo().getLocalPort();
String subjectDn = null;
connectionsAttempted.increment();
try {
subjectDn = ((X509Certificate) ovsdbClient.getConnectionInfo().getRemoteCertificate()).getSubjectDN().getName();
OvsdbConnectionInfo connectionInfo = ovsdbClient.getConnectionInfo();
String remoteHost = connectionInfo.getRemoteAddress().getHostAddress();
Certificate remoteCertificate = connectionInfo.getRemoteCertificate();
if (remoteCertificate == null) {
LOG.debug("Connect attempt no certificate from {} on remote port {}", remoteHost, connectionInfo.getRemotePort());
return;
}
int localPort = connectionInfo.getLocalPort();
String subjectDn = null;
subjectDn = ((X509Certificate) remoteCertificate).getSubjectDN().getName();
String clientCn = SslUtil.extractCN(subjectDn);
LOG.info("ovsdbClient redirector connected from {} on port {} clientCn {}", remoteHost, localPort, clientCn);
ovsdbDao.performRedirect(ovsdbClient, clientCn);
connectionsCreated.increment();
} catch (Exception e) {
connectionsFailed.increment();
//something is wrong with the SSL or with the redirect
ovsdbClient.shutdown();
return;
@@ -63,11 +105,14 @@ public class TipWlanOvsdbRedirector {
}
public void disconnected(OvsdbClient ovsdbClient) {
connectionsDropped.increment();
String remoteHost = ovsdbClient.getConnectionInfo().getRemoteAddress().getHostAddress();
int localPort = ovsdbClient.getConnectionInfo().getLocalPort();
String subjectDn = null;
try {
subjectDn = ((X509Certificate) ovsdbClient.getConnectionInfo().getRemoteCertificate()).getSubjectDN().getName();
Certificate remoteCertificate = ovsdbClient.getConnectionInfo().getRemoteCertificate();
if (remoteCertificate != null)
subjectDn = ((X509Certificate) remoteCertificate).getSubjectDN().getName();
} catch (Exception e) {
//do nothing
}

View File

@@ -9,6 +9,8 @@ import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration;
import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes;
import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPInetState;
@@ -46,6 +48,8 @@ public class OvsdbDao extends OvsdbDaoBase {
OvsdbCommandConfig ovsdbCommand;
@Autowired
OvsdbNodeConfig ovsdbNodeConfig;
@Autowired
OvsdbRadiusProxyConfig ovsdbRadiusProxyConfig;
public String changeRedirectorAddress(OvsdbClient ovsdbClient, String apId, String newRedirectorAddress) {
return ovsdbNode.changeRedirectorAddress(ovsdbClient, apId, newRedirectorAddress);
@@ -58,7 +62,7 @@ public class OvsdbDao extends OvsdbDaoBase {
public void configureCommands(OvsdbClient ovsdbClient, String startdebugengineapcommand,
Map<String, String> payload, long l, long defaultCommandDurationSec) {
ovsdbCommand.configureCommands(ovsdbClient, startdebugengineapcommand, payload, l, defaultCommandDurationSec);
ovsdbCommand.configureCommands(ovsdbClient, startdebugengineapcommand, payload, l, defaultCommandDurationSec);
}
public void configureFirmwareDownload(OvsdbClient ovsdbClient, String apId, String firmwareUrl,
@@ -82,9 +86,29 @@ public class OvsdbDao extends OvsdbDaoBase {
ovsdbNetwork.configureInterfaces(ovsdbClient);
}
public void configureNtpServer(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
public void configureWiredPort(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
ovsdbNetwork.configureEthernetPorts(ovsdbClient, opensyncAPConfig);
}
public void configureNode(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
configureNtpServer(ovsdbClient, opensyncAPConfig);
configureSyslog(ovsdbClient, opensyncAPConfig);
processBlinkRequest(ovsdbClient, opensyncAPConfig.getCustomerEquipment().getInventoryId(),
((ApElementConfiguration) opensyncAPConfig.getCustomerEquipment().getDetails()).isBlinkAllLEDs());
ovsdbNodeConfig.processLedControlEnabled(ovsdbClient, opensyncAPConfig);
}
void configureNtpServer(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
ovsdbNodeConfig.configureNtpServer(ovsdbClient, opensyncAPConfig);
}
void configureSyslog(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
ovsdbNodeConfig.configureSyslog(ovsdbClient, opensyncAPConfig);
}
public void configureRadsecRadiusAndRealm(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
ovsdbRadiusProxyConfig.configureRadius(ovsdbClient, opensyncAPConfig);
}
public void configureSsids(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
ovsdbSsid.configureSsids(ovsdbClient, opensyncAPConfig);
@@ -151,6 +175,10 @@ public class OvsdbDao extends OvsdbDaoBase {
String key, OvsdbClient ovsdbClient) {
return ovsdbMonitor.getOpensyncWifiAssociatedClients(rowUpdate, key, ovsdbClient);
}
public Map<String,String> getAPCState(RowUpdate rowUpdate, String key) {
return ovsdbMonitor.getAPCState(rowUpdate, key);
}
public void getRadiusAccountingConfiguration(OpensyncAPConfig apConfig, SsidConfiguration ssidConfig,
Map<String, String> security) {
@@ -170,6 +198,10 @@ public class OvsdbDao extends OvsdbDaoBase {
Map<RadioType, Integer> primaryChannelMap) {
ovsdbRrm.processNewChannelsRequest(ovsdbClient, backupChannelMap, primaryChannelMap);
}
public void processCellSizeAttributesRequest(OvsdbClient ovsdbClient, Map<RadioType, CellSizeAttributes> cellSizeAttributeMap) {
ovsdbRrm.processCellSizeAttributesRequest(ovsdbClient, cellSizeAttributeMap);
}
public void rebootOrResetAp(OvsdbClient ovsdbClient, String ovsdbAwlanApSwitchSoftwareBank) {
ovsdbNode.rebootOrResetAp(ovsdbClient, ovsdbAwlanApSwitchSoftwareBank);
@@ -178,6 +210,10 @@ public class OvsdbDao extends OvsdbDaoBase {
public void removeAllInetConfigs(OvsdbClient ovsdbClient) {
ovsdbNetwork.removeAllInetConfigs(ovsdbClient);
}
public void resetWiredPorts(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) {
ovsdbNetwork.resetWiredPorts(ovsdbClient, opensyncApConfig);
}
public void removeAllPasspointConfigs(OvsdbClient ovsdbClient) {
ovsdbHotspot.removeAllPasspointConfigs(ovsdbClient);
@@ -190,6 +226,10 @@ public class OvsdbDao extends OvsdbDaoBase {
public void removeAllStatsConfigs(OvsdbClient ovsdbClient) {
ovsdbStats.removeAllStatsConfigs(ovsdbClient);
}
public void removeRadsecRadiusAndRealmConfigs(OvsdbClient ovsdbClient) {
ovsdbRadiusProxyConfig.removeRadiusConfigurations(ovsdbClient);
}
public void removeWifiRrm(OvsdbClient ovsdbClient) {
ovsdbRrm.removeWifiRrm(ovsdbClient);
@@ -210,4 +250,8 @@ public class OvsdbDao extends OvsdbDaoBase {
ovsdbStats.updateEventReportingInterval(ovsdbClient, collectionIntervalSecEvent);
}
public String processBlinkRequest(OvsdbClient ovsdbClient, String apId, boolean blinkAllLEDs) {
return ovsdbNodeConfig.processBlinkRequest(ovsdbClient, apId, blinkAllLEDs);
}
}

View File

@@ -65,6 +65,9 @@ public class OvsdbDaoBase {
public static final String hotspot20IconConfigDbTable = "Hotspot20_Icon_Config";
public static final String hotspot20OsuProvidersDbTable = "Hotspot20_OSU_Providers";
public static final String hotspot20ConfigDbTable = "Hotspot20_Config";
public static final String radiusConfigDbTable = "Radius_Proxy_Config";
public static final String apcConfigDbTable = "APC_Config";
public static final String apcStateDbTable = "APC_State";
public static final String StartDebugEngineApCommand = "startPortForwardingSession";
public static final String StopDebugEngineApCommand = "stopSession";
@@ -138,6 +141,15 @@ public class OvsdbDaoBase {
@org.springframework.beans.factory.annotation.Value("${tip.wlan.externalFileStoreURL:https://localhost:9096}")
String externalFileStoreURL;
@org.springframework.beans.factory.annotation.Value("${tip.wlan.fileStoreDirectory:/tmp/tip-wlan-filestore}")
String fileStoreDirectoryName;
@org.springframework.beans.factory.annotation.Value("${tip.wlan.defaultReportingIntervalSeconds:60}")
public int defaultReportingIntervalSeconds;
@org.springframework.beans.factory.annotation.Value("${tip.wlan.defaultOffChannelReportingIntervalSeconds:120}")
public int defaultOffChannelReportingIntervalSeconds;
public OvsdbDaoBase() {
}
@@ -253,7 +265,7 @@ public class OvsdbDaoBase {
}
}
void fillInRadioInterfaceNames(OvsdbClient ovsdbClient, ConnectNodeInfo ret) {
void fillInRadioInterfaceNamesAndCountry(OvsdbClient ovsdbClient, ConnectNodeInfo ret) {
try {
List<Operation> operations = new ArrayList<>();
List<Condition> conditions = new ArrayList<>();
@@ -261,6 +273,7 @@ public class OvsdbDaoBase {
columns.add("freq_band");
columns.add("if_name");
columns.add("country");
operations.add(new Select(wifiRadioStateDbTable, conditions, columns));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
@@ -280,6 +293,7 @@ public class OvsdbDaoBase {
for (Row row : ((SelectResult) result[0]).getRows()) {
ret.wifiRadioStates.put(getSingleValueFromSet(row, "freq_band"),
getSingleValueFromSet(row, "if_name"));
ret.country = getSingleValueFromSet(row, "country");
}

View File

@@ -18,6 +18,7 @@ import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.Hotspot20Config;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.Hotspot20IconConfig;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.Hotspot20OsuProviders;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.NodeConfigInfo;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.RadiusProxyConfigInfo;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiInetConfigInfo;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiRadioConfigInfo;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiStatsConfigInfo;
@@ -39,11 +40,26 @@ public class OvsdbGet extends OvsdbDaoBase {
Map<String, Set<Integer>> getAllowedChannels(OvsdbClient ovsdbClient) {
Map<String, Set<Integer>> allowedChannels = new HashMap<>();
for (Row row : getOvsdbTableRowsForCondition(ovsdbClient, wifiRadioStateDbTable, null)) {
allowedChannels.put(getSingleValueFromSet(row, "freq_band"), row.getSetColumn("allowed_channels"));
Set<Integer> channels = new HashSet<>();
if (row.getMapColumn("channels").containsKey("allowed")) {
for (String c : row.getMapColumn("channels").get("allowed").toString().split(",")) {
if (c != null)
channels.add(Integer.valueOf(c));
} ;
}
if (row.getMapColumn("channels").containsKey("radar_detection")) {
for (String c : row.getMapColumn("channels").get("radar_detection").toString().split(",")) {
if (c != null)
channels.add(Integer.valueOf(c));
} ;
}
allowedChannels.put(getSingleValueFromSet(row, "freq_band"), channels);
}
return allowedChannels;
}
/**
* Get all Rows from given table that satisfy the conditions.
*
@@ -169,4 +185,13 @@ public class OvsdbGet extends OvsdbDaoBase {
return ret;
}
Map<String, RadiusProxyConfigInfo> getProvisionedRadiusConfigs(OvsdbClient ovsdbClient) {
Map<String, RadiusProxyConfigInfo> ret = new HashMap<>();
for (Row row : getOvsdbTableRowsForCondition(ovsdbClient, radiusConfigDbTable, null)) {
RadiusProxyConfigInfo radiusProxyConfigInfo = new RadiusProxyConfigInfo(row);
ret.put(radiusProxyConfigInfo.radiusConfigName, radiusProxyConfigInfo);
}
return ret;
}
}

View File

@@ -502,9 +502,11 @@ public class OvsdbHotspotConfig extends OvsdbDaoBase {
}
for (Profile ssidProfile : opensyncApConfig.getSsidProfile()) {
if (ssidProfile.getId() == hs2Profile.getOsuSsidProfileId()) {
rowColumns.put("osu_ssid", new Atom<>(((SsidConfiguration) ssidProfile.getDetails()).getSsid()));
break;
if (hs2Profile.getOsuSsidProfileId() != null) {
if (ssidProfile.getId() == hs2Profile.getOsuSsidProfileId()) {
rowColumns.put("osu_ssid", new Atom<>(((SsidConfiguration) ssidProfile.getDetails()).getSsid()));
break;
}
}
}
}
@@ -536,42 +538,63 @@ public class OvsdbHotspotConfig extends OvsdbDaoBase {
hotspotProfile, rowColumns, hs2Profile);
rowColumns.put("deauth_request_timeout", new Atom<>(hs2Profile.getDeauthRequestTimeout()));
rowColumns.put("tos", new Atom<>(hs2Profile.getTermsAndConditionsFile().getApExportUrl()));
if (hs2Profile.getTermsAndConditionsFile() != null) {
rowColumns.put("tos", new Atom<>(hs2Profile.getTermsAndConditionsFile().getApExportUrl()));
}
rowColumns.put("enable", new Atom<>(hs2Profile.isEnableInterworkingAndHs20()));
rowColumns.put("network_auth_type",
new Atom<>("0" + hs2Profile.getNetworkAuthenticationType().getId()));
rowColumns.put("gas_addr3_behavior", new Atom<>(hs2Profile.getGasAddr3Behaviour().getId()));
if (hs2Profile.getGasAddr3Behaviour() != null) {
rowColumns.put("gas_addr3_behavior", new Atom<>(hs2Profile.getGasAddr3Behaviour().getId()));
}
rowColumns.put("operating_class", new Atom<>(hs2Profile.getOperatingClass()));
rowColumns.put("anqp_domain_id", new Atom<>(hs2Profile.getAnqpDomainId()));
rowColumns.put("asra", new Atom<>(hs2Profile.getAdditionalStepsRequiredForAccess() == 1 ? true:false));
rowColumns.put("disable_dgaf", new Atom<>(hs2Profile.isDisableDownstreamGroupAddressedForwarding()));
rowColumns.put("esr", new Atom<>(hs2Profile.isEmergencyServicesReachable()));
if (hs2Profile.getHessid() != null) {
rowColumns.put("hessid", new Atom<>(hs2Profile.getHessid().getAddressAsString()));
}
rowColumns.put("internet", new Atom<>(hs2Profile.isInternetConnectivity()));
if (hs2Profile.getQosMapSetConfiguration() != null) {
rowColumns.put("qos_map_set", new Atom<>(String.join(",", hs2Profile.getQosMapSetConfiguration())));
}
rowColumns.put("uesa", new Atom<>(hs2Profile.isUnauthenticatedEmergencyServiceAccessible()));
Set<Atom<String>> connectionCapabilities = new HashSet<>();
hs2Profile.getConnectionCapabilitySet().stream()
.forEach(c -> connectionCapabilities
.add(new Atom<>(c.getConnectionCapabilitiesIpProtocol().getId() + ":"
+ c.getConnectionCapabilitiesPortNumber() + ":"
+ c.getConnectionCapabilitiesStatus().getId())));
.forEach(c -> connectionCapabilities
.add(new Atom<>(c.getConnectionCapabilitiesIpProtocol().getId() + ":"
+ c.getConnectionCapabilitiesPortNumber() + ":"
+ c.getConnectionCapabilitiesStatus().getId())));
com.vmware.ovsdb.protocol.operation.notation.Set connectionCapabilitySet = com.vmware.ovsdb.protocol.operation.notation.Set
.of(connectionCapabilities);
rowColumns.put("connection_capability", connectionCapabilitySet);
// access_network_type to add when supported by AP
if (ovsdbClient.getSchema(ovsdbName).get().getTables().get(hotspot20ConfigDbTable).getColumns().containsKey("access_network_type")) {
if (hs2Profile.getAccessNetworkType() != null) {
rowColumns.put("access_network_type", new Atom<>(hs2Profile.getAccessNetworkType().getId()));
}
}
// # format: <1-octet encoded value as hex str>
// # (ipv4_type & 0x3f) << 2 | (ipv6_type & 0x3) << 2
// # (ipv4_type & 0x3f) << 2 | (ipv6_type & 0x3)
// 0x3f = 63 in decimal
// 0x3 = 3 in decimal
if (PasspointIPv6AddressType.getByName(
hs2Profile.getIpAddressTypeAvailability()) != PasspointIPv6AddressType.UNSUPPORTED) {
int availability = PasspointIPv6AddressType
.getByName(hs2Profile.getIpAddressTypeAvailability()).getId();
String hexString = Integer.toHexString((availability & 3) << 2);
String hexString = String.format("%02x", (availability & 0x3));
rowColumns.put("ipaddr_type_availability", new Atom<>(hexString));
} else if (PasspointIPv4AddressType.getByName(
}else if (PasspointIPv4AddressType.getByName(
hs2Profile.getIpAddressTypeAvailability()) != PasspointIPv4AddressType.UNSUPPORTED) {
int availability = PasspointIPv4AddressType
.getByName(hs2Profile.getIpAddressTypeAvailability()).getId();
String hexString = Integer.toHexString((availability & 63) << 2);
String hexString = String.format("%02x", ((availability & 0x3f) << 2));
rowColumns.put("ipaddr_type_availability", new Atom<>(hexString));
}
}
Row row = new Row(rowColumns);
Insert newHs20Config = new Insert(hotspot20ConfigDbTable, row);
@@ -652,8 +675,8 @@ public class OvsdbHotspotConfig extends OvsdbDaoBase {
operations.add(newOsuProvider);
} else {
List<Condition> conditions = new ArrayList<>();
conditions.add(new Condition("server_uri", Function.EQUALS,
new Atom<>(providerProfile.getOsuServerUri())));
conditions.add(new Condition("osu_provider_name", Function.EQUALS,
new Atom<>(apOsuProviderName)));
Update updatedOsuProvider = new Update(hotspot20OsuProvidersDbTable, conditions, row);
operations.add(updatedOsuProvider);
}

View File

@@ -1,7 +1,9 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
@@ -91,6 +93,8 @@ public class OvsdbMonitor extends OvsdbDaoBase {
if (rowUpdate.getOld() != null) {
row = rowUpdate.getOld();
row.getColumns().putAll(rowUpdate.getNew().getColumns());
} else {
row = rowUpdate.getNew();
}
} else {
row = rowUpdate.getOld();
@@ -168,5 +172,19 @@ public class OvsdbMonitor extends OvsdbDaoBase {
} else {
return List.of();
}
}
Map<String, String> getAPCState(RowUpdate rowUpdate, String apId) {
Map<String, String> ret = new HashMap<>();
if (rowUpdate.getNew() != null) {
Row row = rowUpdate.getNew();
ret.put("designatedRouterIp", getSingleValueFromSet(row, "dr_addr"));
ret.put("backupDesignatedRouterIp", getSingleValueFromSet(row, "bdr_addr"));
ret.put("enabled", getSingleValueFromSet(row, "enabled").toString());
ret.put("mode", getSingleValueFromSet(row, "mode"));
}
return ret;
}
}

View File

@@ -21,10 +21,17 @@ import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.equipment.models.NetworkForwardMode;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiInetConfigInfo;
import com.telecominfraproject.wlan.profile.ethernetport.models.WiredEthernetPortConfiguration;
import com.telecominfraproject.wlan.profile.ethernetport.models.WiredPort;
import com.telecominfraproject.wlan.profile.models.Profile;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.telecominfraproject.wlan.profile.network.models.GreTunnelConfiguration;
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
import com.telecominfraproject.wlan.status.StatusServiceInterface;
import com.telecominfraproject.wlan.status.equipment.report.models.WiredEthernetPortStatusData;
import com.telecominfraproject.wlan.status.equipment.report.models.WiredPortStatus;
import com.telecominfraproject.wlan.status.models.Status;
import com.telecominfraproject.wlan.status.models.StatusDataType;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.Delete;
import com.vmware.ovsdb.protocol.operation.Insert;
@@ -45,7 +52,18 @@ import com.vmware.ovsdb.service.OvsdbClient;
public class OvsdbNetworkConfig extends OvsdbDaoBase {
@Autowired
OvsdbGet ovsdbGet;
private OvsdbGet ovsdbGet;
@Autowired
private StatusServiceInterface statusServiceInterface;
private static final String VLAN_IF_TYPE = "vlan";
private static final String VLAN_TRUNK_IF_TYPE = "vlan_trunk";
private static final String BRIDGE_IF_TYPE = "bridge";
private static final String LAN_IF_NAME = "lan";
private static final String WAN_IF_NAME = "wan";
private static final int DEFAULT_MAX_INTERNAL_VLAN_ID = 2;
private static final String SEPARATOR = " ";
void configureGreTunnel(OvsdbClient ovsdbClient, Profile apNetworkConfiguration) {
try {
@@ -92,7 +110,7 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
LOG.info("configureGreTunnel {}", ((UpdateResult) res).toString());
} else if (res instanceof ErrorResult) {
LOG.error("configureGreTunnel error {}", (res));
throw new RuntimeException("configureGreTunnel " + ((ErrorResult) res).getError() + " "
throw new RuntimeException("configureGreTunnel " + ((ErrorResult) res).getError() + SEPARATOR
+ ((ErrorResult) res).getDetails());
}
}
@@ -137,10 +155,242 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
} else {
operations.add(new Insert(wifiInetConfigDbTable, row));
}
}
void configureEthernetPorts(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) {
Profile wiredEthernetPortProfile = opensyncApConfig.getWiredEthernetPortProfile();
if (wiredEthernetPortProfile != null) {
LOG.debug("Entering configure Ethernet Ports for wiredEthernetPortProfile {} for equipment {}",
wiredEthernetPortProfile, opensyncApConfig.getCustomerEquipment().getId());
// Getting the config from the UI
WiredEthernetPortConfiguration ethernetPortConfig = (WiredEthernetPortConfiguration) wiredEthernetPortProfile
.getDetails();
LOG.debug("Configure EthernetPorts {}", ethernetPortConfig);
Set<WiredPort> desiredWiredPorts = ethernetPortConfig.getEthPorts();
handleEthernetPortConfiguration(ovsdbClient, desiredWiredPorts);
} else {
LOG.info("opensyncApConfig for Customer {}, Equipment {} has no wiredEthernetPortProfile attached" ,
opensyncApConfig.getCustomerEquipment().getCustomerId(), opensyncApConfig.getCustomerEquipment().getId());
}
}
private void handleEthernetPortConfiguration(OvsdbClient ovsdbClient, Set<WiredPort> desiredWiredPorts) {
// lists are for more than one lan port moving to wan ("eth0 eth1 eth2")
Set<String> availableLanEthNames = new HashSet<>();
Set<String> availableWanEthNames = new HashSet<>();
if (desiredWiredPorts == null) {
LOG.info("Cannot handle the EthernetPort config for null desired Wired Ports. Exiting");
return;
}
LOG.debug("In handleEthernetPortConfiguration with desiredWiredPorts {}", desiredWiredPorts);
WiredPort wanPort = getDefaultWanPort(desiredWiredPorts);
if (wanPort == null) {
LOG.error("Cannot find the default wan port from the desired list of ports {}" , desiredWiredPorts);
return;
}
for (WiredPort port: desiredWiredPorts) {
if (port.getIfName().contains(LAN_IF_NAME)) { // for AP has ifName lan1, lan2 instead of lan
availableLanEthNames.add(port.getName());
} else if (WAN_IF_NAME.equals(port.getIfName())) {
availableWanEthNames.add(port.getName());
}
}
for (WiredPort desiredPort : desiredWiredPorts) {
if (!desiredPort.equals(wanPort)) {
if (isLanToBridgeConversion(desiredPort) && !desiredPort.isTrunkEnabled()) {
// Flow 1: Desired Bridge + Access
LOG.debug("Desired Config is Bridge with Access Mode");
availableLanEthNames.remove(desiredPort.getName());
availableWanEthNames.add(desiredPort.getName());
changeLanToWan(ovsdbClient, availableLanEthNames, availableWanEthNames, wanPort.getName());
createVlanTag(ovsdbClient, desiredPort);
} else if (isLanToBridgeConversion(desiredPort) && desiredPort.isTrunkEnabled()) {
// Flow 2: Desired Bridge + Trunk
LOG.debug("Desired Config is Bridge with Trunk Mode");
availableLanEthNames.remove(desiredPort.getName());
availableWanEthNames.add(desiredPort.getName());
changeLanToWan(ovsdbClient, availableLanEthNames, availableWanEthNames, wanPort.getName());
createTrunkInterface(ovsdbClient, desiredPort);
} else if (!BRIDGE_IF_TYPE.equalsIgnoreCase(desiredPort.getIfType())) {
// Flow 3: Desired ifType is NAT
LOG.debug("Desired Config is NAT (LAN) mode. Desired Port {} may still be tagged to WAN interface. Convert to LAN mode", desiredPort.getIfName());
availableLanEthNames.add(desiredPort.getName());
availableWanEthNames.remove(desiredPort.getName());
changeWanToLan(ovsdbClient, availableLanEthNames, availableWanEthNames, wanPort.getName());
} else {
LOG.info("Not a supported Config change requested for the port {}", desiredPort);
}
} else {
LOG.error("It's the default WAN port. No changes needed!");
}
} // end of for loop
}
private String generateInterfaceId(String portName, int vlanId, boolean trunk) {
if (!trunk) {
return String.format("%s_%s", portName, vlanId);
} else {
return String.format("%s_trunk", portName);
}
}
private boolean isLanToBridgeConversion(WiredPort desiredPort) {
return LAN_IF_NAME.equalsIgnoreCase(desiredPort.getIfName()) &&
BRIDGE_IF_TYPE.equals(desiredPort.getIfType());
}
WiredPort getDefaultWanPort(Set<WiredPort> desiredPorts) {
WiredPort wanWiredPort = desiredPorts.stream()
.filter(entry -> WAN_IF_NAME.equals(entry.getIfName())).findFirst().orElse(null);
LOG.debug("Returning wanWiredPort {}", wanWiredPort);
return wanWiredPort;
}
void changeLanToWan(OvsdbClient ovsdbClient, Set<String> lanPortsToUpdate, Set<String> wanPortsToUpdate, String wanEthName) {
LOG.debug("Calling changeLanToWan: moving port {} to LAN and {} to WAN", lanPortsToUpdate, wanPortsToUpdate);
List<Operation> operations = new ArrayList<>();
// Step1: remove lan from eth_ports
// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:=" " -w if_name==lan
// or cases like: /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth2" -w if_name==lan
String lanPortsString = String.join(SEPARATOR, lanPortsToUpdate);
addEthPortsOperation(operations, lanPortsString.equals("")? SEPARATOR : lanPortsString, LAN_IF_NAME);
// Step2: make lan to a wan port
// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth0 eth1" -w if_name==wan
// eth_ports syntax is set by AP (i.e, eth0 eth1)
// AP needs the original wan port be the first port in the string. Since we will hard code it, we remove
// original wan name from the set to avoid duplication
wanPortsToUpdate.remove(wanEthName);
// trim() is used when wanPortsToUpdate is empty (i.e. we want "eth0" instead of "eth0 ")
addEthPortsOperation(operations, (wanEthName + SEPARATOR + String.join(SEPARATOR, wanPortsToUpdate)).trim(), WAN_IF_NAME);
sendOperationsToAP(ovsdbClient, operations, "changeLanToWan");
}
private void createVlanTag(OvsdbClient ovsdbClient, WiredPort desiredWiredPort) {
LOG.debug("Creating a new VlanInterface for wiredPort {}", desiredWiredPort);
if (desiredWiredPort.getVlanId() > DEFAULT_MAX_INTERNAL_VLAN_ID) {
// Tag to vlan
// /usr/opensync/bin/ovsh i Wifi_Inet_Config NAT:=true enabled:=true
// if_name:=eth0_100 if_type:=vlan ip_assign_scheme:=none network:=true
// parent_ifname:=eth0 vlan_id:=100 dhcp_sniff:=false eth_ports:="eth0"
List<Operation> operations = new ArrayList<>();
Map<String, Value> tableColumns = new HashMap<>();
tableColumns.put("NAT", new Atom<>(true));
tableColumns.put("enabled", new Atom<>(true));
tableColumns.put("if_name", new Atom<>(generateInterfaceId(desiredWiredPort.getName(), desiredWiredPort.getVlanId(), false)));
tableColumns.put("if_type", new Atom<>(VLAN_IF_TYPE));
tableColumns.put("ip_assign_scheme", new Atom<>("none"));
tableColumns.put("network", new Atom<>(true));
tableColumns.put("parent_ifname", new Atom<>(desiredWiredPort.getName()));
tableColumns.put("vlan_id", new Atom<>(desiredWiredPort.getVlanId()));
tableColumns.put("dhcp_sniff", new Atom<>(false));
tableColumns.put("eth_ports", new Atom<>(desiredWiredPort.getName()));
Row row = new Row(tableColumns);
operations.add(new Insert(wifiInetConfigDbTable, row));
sendOperationsToAP(ovsdbClient, operations, "createVlanTag");
} else {
LOG.info("Desired vlanId {} is lower than default {}; no tagging needed",
desiredWiredPort.getVlanId(), DEFAULT_MAX_INTERNAL_VLAN_ID);
}
}
private void createTrunkInterface(OvsdbClient ovsdbClient, WiredPort desiredWiredPort) {
LOG.debug("Creating a new TrunkInterface for wiredPort {}", desiredWiredPort);
// Create Trunk Interface
// /usr/opensync/bin/ovsh i Wifi_Inet_Config NAT:=true enabled:=true
// if_name:=eth0_trunk if_type:=vlan_trunk ip_assign_scheme:=none network:=true
// parent_ifname:=eth0 dhcp_sniff:=false eth_ports:="eth0"
// vlan_trunk:='["map",[["allowed_vlans","100 200 300"],["pvid","10"]]]'
List<Operation> operations = new ArrayList<>();
Map<String, Value> tableColumns = new HashMap<>();
tableColumns.put("NAT", new Atom<>(true));
tableColumns.put("enabled", new Atom<>(true));
tableColumns.put("if_name", new Atom<>(generateInterfaceId(desiredWiredPort.getName(), desiredWiredPort.getVlanId(), true)));
tableColumns.put("if_type", new Atom<>(VLAN_TRUNK_IF_TYPE));
tableColumns.put("ip_assign_scheme", new Atom<>("none"));
tableColumns.put("network", new Atom<>(true));
tableColumns.put("parent_ifname", new Atom<>(desiredWiredPort.getName()));
tableColumns.put("dhcp_sniff", new Atom<>(false));
tableColumns.put("eth_ports", new Atom<>(desiredWiredPort.getName()));
Map<String, String> vlanTrunkMap = new HashMap<>();
if (desiredWiredPort.getAllowedVlanIds() != null) {
vlanTrunkMap.put("allowed_vlans", getAllowedVlanAsString(desiredWiredPort));
if (desiredWiredPort.getVlanId() > DEFAULT_MAX_INTERNAL_VLAN_ID) {
vlanTrunkMap.put("pvid", String.valueOf(desiredWiredPort.getVlanId()));
}
}
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> vlanTrunkVal = com.vmware.ovsdb.protocol.operation.notation.Map.of(vlanTrunkMap);
tableColumns.put(VLAN_TRUNK_IF_TYPE, vlanTrunkVal);
Row row = new Row(tableColumns);
operations.add(new Insert(wifiInetConfigDbTable, row));
sendOperationsToAP(ovsdbClient, operations, "createTrunkInterface");
}
private String getAllowedVlanAsString(WiredPort desiredWiredPort) {
return desiredWiredPort.getAllowedVlanIds().stream().map(String::valueOf).collect(Collectors.joining(SEPARATOR));
}
void changeWanToLan(OvsdbClient ovsdbClient, Set<String> lanPortsToUpdate, Set<String> wanPortsToUpdate, String wanEthName) {
LOG.debug("Calling changeWanToLan: Moving port {} to LAN and {} to WAN", lanPortsToUpdate, wanPortsToUpdate);
// Step1: set the correct port to lan
// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth0" -w if_name==lan
List<Operation> operations = new ArrayList<>();
addEthPortsOperation(operations, String.join(SEPARATOR, lanPortsToUpdate), LAN_IF_NAME);
// Step2: set the correct port to wan
// /usr/opensync/bin/ovsh u Wifi_Inet_Config eth_ports:="eth1" -w if_name==wan
// AP needs the original wan port be the first port in the string. Since we will hard code it, we remove
// original wan name from the set to avoid duplication
wanPortsToUpdate.remove(wanEthName);
addEthPortsOperation(operations, (wanEthName + SEPARATOR + String.join(SEPARATOR, wanPortsToUpdate)).trim(), WAN_IF_NAME);
sendOperationsToAP(ovsdbClient, operations, "changeWanToLan");
}
void addEthPortsOperation(List<Operation> operations, String ethPorts, String ifName) {
Map<String, Value> tableColumn = new HashMap<>();
tableColumn.put("eth_ports", new Atom<>(ethPorts));
Row row = new Row(tableColumn);
operations.add(new Update(wifiInetConfigDbTable,
List.of(new Condition("if_name", Function.EQUALS, new Atom<>(ifName))), row));
}
void sendOperationsToAP(OvsdbClient ovsdbClient, List<Operation> operations, String methodName) {
try {
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
if (res instanceof InsertResult) {
LOG.info("{} - {}", methodName, res);
} else if (res instanceof UpdateResult) {
LOG.info("{} {}", methodName, res);
} else if (res instanceof ErrorResult) {
LOG.error("{} {}", methodName, res);
throw new RuntimeException("createVlanNetworkInterfaces - " + ((ErrorResult) res).getError() + SEPARATOR
+ ((ErrorResult) res).getDetails());
}
}
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
}
/**
* @param ovsdbClient
* @param ovsdbClient
* @param vifInterfaceName
* @param enabled
* @param networkForwardMode
@@ -193,7 +443,7 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
LOG.info("createVlanNetworkInterfaces {}", ((UpdateResult) res).toString());
} else if (res instanceof ErrorResult) {
LOG.error("createVlanNetworkInterfaces error {}", (res));
throw new RuntimeException("createVlanNetworkInterfaces " + ((ErrorResult) res).getError() + " "
throw new RuntimeException("createVlanNetworkInterfaces " + ((ErrorResult) res).getError() + SEPARATOR
+ ((ErrorResult) res).getDetails());
}
}
@@ -212,34 +462,8 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
List<Operation> operations = new ArrayList<>();
Map<String, Value> tableColumns = new HashMap<>();
Map<String, WifiInetConfigInfo> inetConfigMap = ovsdbGet.getProvisionedWifiInetConfigs(ovsdbClient);
WifiInetConfigInfo parentLanInterface = inetConfigMap.get(defaultLanInterfaceName);
if (parentLanInterface == null) {
throw new RuntimeException(
"Cannot get lan interface " + defaultLanInterfaceName + " for vlan " + vlanId);
}
tableColumns.put("if_type", new Atom<>("vlan"));
tableColumns.put("vlan_id", new Atom<>(vlanId));
tableColumns.put("if_name", new Atom<>(parentLanInterface.ifName + "_" + Integer.toString(vlanId)));
tableColumns.put("parent_ifname", new Atom<>(parentLanInterface.ifName));
tableColumns.put("enabled", new Atom<>(true));
tableColumns.put("network", new Atom<>(true));
tableColumns.put("ip_assign_scheme", new Atom<>(parentLanInterface.ipAssignScheme));
tableColumns.put("NAT", new Atom<>(parentLanInterface.nat));
tableColumns.put("mtu", new Atom<>(1500));
String[] inetAddress = parentLanInterface.inetAddr.split("\\.");
String vlanAddress = inetAddress[0] + "." + inetAddress[1] + "." + vlanId + "." + inetAddress[3];
tableColumns.put("inet_addr", new Atom<>(vlanAddress));
tableColumns.put("netmask", new Atom<>(parentLanInterface.netmask));
tableColumns.put("dhcpd", com.vmware.ovsdb.protocol.operation.notation.Map.of(parentLanInterface.dhcpd));
Row row = new Row(tableColumns);
if (inetConfigMap.containsKey(parentLanInterface.ifName + "_" + Integer.toString(vlanId))) {
List<Condition> conditions = new ArrayList<>();
conditions.add(new Condition("vlan_id", Function.EQUALS, new Atom<>(vlanId)));
conditions.add(new Condition("parent_ifname", Function.EQUALS, new Atom<>(parentLanInterface.ifName)));
operations.add(new Update(wifiInetConfigDbTable, conditions, row));
} else {
operations.add(new Insert(wifiInetConfigDbTable, row));
}
WifiInetConfigInfo parentWanInterface = inetConfigMap.get(defaultWanInterfaceName);
if (parentWanInterface == null) {
throw new RuntimeException(
@@ -251,8 +475,7 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
tableColumns.put("if_name", new Atom<>(parentWanInterface.ifName + "_" + Integer.toString(vlanId)));
tableColumns.put("parent_ifname", new Atom<>(parentWanInterface.ifName));
tableColumns.put("enabled", new Atom<>(true));
tableColumns.put("network", new Atom<>(true));
tableColumns.put("ip_assign_scheme", new Atom<>(parentWanInterface.ipAssignScheme));
tableColumns.put("ip_assign_scheme", new Atom<>("none"));
tableColumns.put("NAT", new Atom<>(parentWanInterface.nat));
tableColumns.put("mtu", new Atom<>(1500));
row = new Row(tableColumns);
@@ -272,14 +495,13 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
LOG.info("createVlanNetworkInterfaces {}", ((UpdateResult) res).toString());
} else if (res instanceof ErrorResult) {
LOG.error("createVlanNetworkInterfaces error {}", (res));
throw new RuntimeException("createVlanNetworkInterfaces " + ((ErrorResult) res).getError() + " "
throw new RuntimeException("createVlanNetworkInterfaces " + ((ErrorResult) res).getError() + SEPARATOR
+ ((ErrorResult) res).getDetails());
}
}
inetConfigMap = ovsdbGet.getProvisionedWifiInetConfigs(ovsdbClient);
LOG.debug("Provisioned vlan on wan {} and lan {}",
inetConfigMap.get(parentWanInterface.ifName + "_" + Integer.toString(vlanId)),
inetConfigMap.get(parentLanInterface.ifName + "_" + Integer.toString(vlanId)));
inetConfigMap.get(parentWanInterface.ifName + "_" + Integer.toString(vlanId)));
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
LOG.error("Error in provisioning Vlan", e);
throw new RuntimeException(e);
@@ -316,33 +538,34 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
Collection<WifiInetConfigInfo> provisionedWifiInetConfigs = ovsdbGet
.getProvisionedWifiInetConfigs(ovsdbClient).values();
List<Operation> operations = new ArrayList<>();
List<Condition> conditions = new ArrayList<>();
for (WifiInetConfigInfo wifiInetConfigInfo : provisionedWifiInetConfigs) {
if (wifiInetConfigInfo.vlanId > 1 || wifiInetConfigInfo.ifType.equals("vif")
|| wifiInetConfigInfo.ifName.startsWith("gre") || wifiInetConfigInfo.ifType.equals("gre")) {
conditions = new ArrayList<>();
if (wifiInetConfigInfo.vlanId > 1
|| wifiInetConfigInfo.ifType.equals("vif")
|| wifiInetConfigInfo.ifName.startsWith("gre") || wifiInetConfigInfo.ifType.equals("gre")
|| VLAN_IF_TYPE.equalsIgnoreCase(wifiInetConfigInfo.ifType) // Remove any existing vlan/vlan_trunk tagging
|| VLAN_TRUNK_IF_TYPE.equalsIgnoreCase(wifiInetConfigInfo.ifType) ) {
List<Condition> conditions = new ArrayList<>();
conditions.add(new Condition("if_name", Function.EQUALS, new Atom<>(wifiInetConfigInfo.ifName)));
operations.add(new Delete(wifiInetConfigDbTable, conditions));
}
}
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
LOG.info("Removed all existing vif, vlan, and gre interface configs from {}:", wifiInetConfigDbTable);
LOG.info("Removed all existing vif, vlan, vlan_trunk and gre interface configs from {}:", wifiInetConfigDbTable);
for (OperationResult res : result) {
LOG.info("Op Result {}", res);
}
provisionedWifiInetConfigs = ovsdbGet.getProvisionedWifiInetConfigs(ovsdbClient).values();
for (WifiInetConfigInfo inetConfigInfo : provisionedWifiInetConfigs) {
if (inetConfigInfo.ifType.equals("vif") || inetConfigInfo.ifType.equals("gre")) {
if (inetConfigInfo.ifType.equals("vif") || inetConfigInfo.ifType.equals("gre") ||
VLAN_IF_TYPE.equals(inetConfigInfo.ifType) || VLAN_TRUNK_IF_TYPE.equals(inetConfigInfo.ifType)) {
throw new RuntimeException(
"Failed to remove all vif and gre interface configurations from Wifi_Inet_Config dbTable, still has "
"Failed to remove all vif, gre, vlan interface configurations from Wifi_Inet_Config dbTable, still has "
+ provisionedWifiInetConfigs.stream().filter(new Predicate<WifiInetConfigInfo>() {
@Override
public boolean test(WifiInetConfigInfo t) {
if ((t.ifType.equals("vif")) || (t.ifType.equals("gre"))) {
return true;
}
return false;
return (t.ifType.equals("vif")) || (t.ifType.equals("gre")) ||
VLAN_IF_TYPE.equals(t.ifType) || VLAN_TRUNK_IF_TYPE.equals(t.ifType);
}
}).collect(Collectors.toList()));
@@ -353,4 +576,56 @@ public class OvsdbNetworkConfig extends OvsdbDaoBase {
throw new RuntimeException(e);
}
}
// Reset all LAN ports from WAN back to LAN (NAT mode)
void resetWiredPorts(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) {
LOG.debug("Calling resetWiredPorts");
// e.g. eth1
Map<String, List<WiredPortStatus>> interfacePortStatusMap = getInterfacePortStatus(
opensyncApConfig.getCustomerEquipment().getCustomerId(),
opensyncApConfig.getCustomerEquipment().getId());
if (interfacePortStatusMap == null) {
LOG.info("No InterfacePort(EthernetPort) Status. Exiting");
return;
}
List<WiredPortStatus> wanPortStatusList = interfacePortStatusMap.get(WAN_IF_NAME);
if (wanPortStatusList == null) {
LOG.info("No wan interface status available. Exiting");
return;
}
WiredPortStatus originalWanPortStatus = wanPortStatusList.stream()
.filter(wan -> WAN_IF_NAME.equals(wan.getOriginalIfName())).findFirst().orElse(null);
if (originalWanPortStatus == null) {
LOG.info("No original wan port available. Exiting");
return;
}
String wanEthName = originalWanPortStatus.getName();
Set<String> lanEthNames = new HashSet<>();
for (WiredPortStatus wanPortStatus : wanPortStatusList) {
if (wanPortStatus.getOriginalIfName().contains(LAN_IF_NAME)) {
lanEthNames.add(wanPortStatus.getName());
}
}
if (!lanEthNames.isEmpty()) {
Set<String> wanEthNameSet = new HashSet<String>();
wanEthNameSet.add(wanEthName);
changeWanToLan(ovsdbClient, lanEthNames, wanEthNameSet, wanEthName);
}
}
private Map<String, List<WiredPortStatus>> getInterfacePortStatus(int customerId, long equipmentId) {
Map<String, List<WiredPortStatus>> interfacePortStatus = null;
// Getting the status from the current AP
Status existingPortStatus = statusServiceInterface.getOrNull(customerId, equipmentId,
StatusDataType.WIRED_ETHERNET_PORT);
if (existingPortStatus != null && existingPortStatus.getDetails() instanceof WiredEthernetPortStatusData) {
interfacePortStatus = ((WiredEthernetPortStatusData) existingPortStatus.getDetails())
.getInterfacePortStatusMap();
}
if (interfacePortStatus == null || interfacePortStatus.isEmpty()) {
LOG.info("No ethernetPortStatus found for customer {}, equipment {}", customerId, equipmentId);
}
return interfacePortStatus;
}
}

View File

@@ -1,9 +1,11 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
@@ -25,6 +27,7 @@ import com.vmware.ovsdb.protocol.operation.notation.Value;
import com.vmware.ovsdb.protocol.operation.result.ErrorResult;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.operation.result.SelectResult;
import com.vmware.ovsdb.protocol.schema.DatabaseSchema;
import com.vmware.ovsdb.service.OvsdbClient;
@Component
@@ -85,8 +88,7 @@ public class OvsdbNode extends OvsdbDaoBase {
}
Row row = null;
if ((result != null) && (result.length > 0) && (result[0] instanceof SelectResult)
&& !((SelectResult) result[0]).getRows().isEmpty()) {
if ((result != null) && (result.length > 0) && (result[0] instanceof SelectResult) && !((SelectResult) result[0]).getRows().isEmpty()) {
row = ((SelectResult) result[0]).getRows().iterator().next();
connectNodeInfo.lanIpV4Address = getSingleValueFromSet(row, "inet_addr");
connectNodeInfo.lanIfName = row.getStringColumn("if_name");
@@ -103,8 +105,7 @@ public class OvsdbNode extends OvsdbDaoBase {
}
void fillInWanIpAddressAndMac(OvsdbClient ovsdbClient, ConnectNodeInfo connectNodeInfo, String ifType,
String ifName) {
void fillInWanIpAddressAndMac(OvsdbClient ovsdbClient, ConnectNodeInfo connectNodeInfo, String ifType, String ifName) {
try {
List<Operation> operations = new ArrayList<>();
List<Condition> conditions = new ArrayList<>();
@@ -132,8 +133,7 @@ public class OvsdbNode extends OvsdbDaoBase {
}
Row row = null;
if ((result != null) && (result.length > 0) && (result[0] instanceof SelectResult)
&& !((SelectResult) result[0]).getRows().isEmpty()) {
if ((result != null) && (result.length > 0) && (result[0] instanceof SelectResult) && !((SelectResult) result[0]).getRows().isEmpty()) {
row = ((SelectResult) result[0]).getRows().iterator().next();
connectNodeInfo.ipV4Address = getSingleValueFromSet(row, "inet_addr");
connectNodeInfo.ifName = row.getStringColumn("if_name");
@@ -166,7 +166,20 @@ public class OvsdbNode extends OvsdbDaoBase {
columns.add("platform_version");
columns.add("revision");
columns.add("version_matrix");
columns.add("id");
DatabaseSchema dbSchema = ovsdbClient.getSchema(ovsdbName).get();
Set<String> keys = dbSchema.getTables().get(awlanNodeDbTable).getColumns().keySet();
if (keys.containsAll(Set.of("reference_design", "model_description", "manufacturer_url", "manufacturer_name", "manufacturer_date",
"certification_region"))) {
columns.addAll(Set.of("reference_design", "model_description", "manufacturer_url", "manufacturer_name", "manufacturer_date",
"certification_region"));
}
if (keys.contains("qr_code")) {
columns.add("qr_code");
}
operations.add(new Select(awlanNodeDbTable, conditions, columns));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
@@ -180,8 +193,7 @@ public class OvsdbNode extends OvsdbDaoBase {
}
Row row = null;
if ((result != null) && (result.length > 0) && (result[0] instanceof SelectResult)
&& !((SelectResult) result[0]).getRows().isEmpty()) {
if ((result != null) && (result.length > 0) && (result[0] instanceof SelectResult) && !((SelectResult) result[0]).getRows().isEmpty()) {
row = ((SelectResult) result[0]).getRows().iterator().next();
}
@@ -199,6 +211,20 @@ public class OvsdbNode extends OvsdbDaoBase {
ret.serialNumber = getSingleValueFromSet(row, "serial_number");
ret.model = getSingleValueFromSet(row, "model");
if (keys.containsAll(Set.of("reference_design", "model_description", "manufacturer_url", "manufacturer_name", "manufacturer_date",
"certification_region"))) {
ret.referenceDesign = row.getStringColumn("reference_design");
ret.modelDescription = row.getStringColumn("model_description");
ret.manufacturerUrl = row.getStringColumn("manufacturer_url");
ret.manufacturerName = row.getStringColumn("manufacturer_name");
ret.manufacturerDate = row.getStringColumn("manufacturer_date");
ret.certificationRegion = row.getStringColumn("certification_region");
}
if (keys.contains("qr_code")) {
ret.qrCode = row.getMapColumn("qr_code");
}
// now populate macAddress, ipV4Address from Wifi_Inet_State
// first look them up for if_name = br-wan
fillInWanIpAddressAndMac(ovsdbClient, ret, defaultWanInterfaceType, defaultWanInterfaceName);
@@ -207,13 +233,12 @@ public class OvsdbNode extends OvsdbDaoBase {
fillInWanIpAddressAndMac(ovsdbClient, ret, defaultLanInterfaceType, defaultLanInterfaceName);
if (ret.ipV4Address == null) {
throw new RuntimeException(
"Could not get inet address for Lan and Wan network interfaces. Node is not ready to connect.");
throw new RuntimeException("Could not get inet address for Lan and Wan network interfaces. Node is not ready to connect.");
}
}
fillInLanIpAddressAndMac(ovsdbClient, ret, defaultLanInterfaceType);
fillInRadioInterfaceNames(ovsdbClient, ret);
fillInRadioInterfaceNamesAndCountry(ovsdbClient, ret);
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
@@ -262,8 +287,8 @@ public class OvsdbNode extends OvsdbDaoBase {
serialNumber = getSingleValueFromSet(row, "serial_number");
model = getSingleValueFromSet(row, "model");
LOG.info("Redirecting AP Node: clientCn {} serialNumber {} model {} firmwareVersion {} skuNumber {}",
clientCn, serialNumber, model, firmwareVersion, skuNumber);
LOG.info("Redirecting AP Node: clientCn {} serialNumber {} model {} firmwareVersion {} skuNumber {}", clientCn, serialNumber, model,
firmwareVersion, skuNumber);
// Update table AWLAN_Node - set manager_addr
operations.clear();
@@ -293,8 +318,7 @@ public class OvsdbNode extends OvsdbDaoBase {
void rebootOrResetAp(OvsdbClient ovsdbClient, String desiredApAction) {
try {
LOG.debug("rebootOrResetAp on AP perform {}, setting timer for {} seconds.", desiredApAction,
rebootOrResetTimerSeconds);
LOG.debug("rebootOrResetAp on AP perform {}, setting timer for {} seconds.", desiredApAction, rebootOrResetTimerSeconds);
List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>();
updateColumns.put("firmware_url", new Atom<>(desiredApAction));
@@ -315,8 +339,8 @@ public class OvsdbNode extends OvsdbDaoBase {
}
ConnectNodeInfo updateConnectNodeInfoOnConnect(OvsdbClient ovsdbClient, String clientCn,
ConnectNodeInfo incomingConnectNodeInfo, boolean preventCnAlteration) {
ConnectNodeInfo updateConnectNodeInfoOnConnect(OvsdbClient ovsdbClient, String clientCn, ConnectNodeInfo incomingConnectNodeInfo,
boolean preventCnAlteration) {
ConnectNodeInfo ret = incomingConnectNodeInfo.clone();
try {
@@ -327,9 +351,27 @@ public class OvsdbNode extends OvsdbDaoBase {
// updateColumns.put("device_mode", new Atom<String>("cloud") );
// update sku_number if it was empty
if ((ret.skuNumber == null) || ret.skuNumber.isEmpty()) {
ret.skuNumber = "tip.wlan_" + ret.serialNumber;
updateColumns.put("sku_number", new Atom<>(ret.skuNumber));
if (( ret.skuNumber == null) || ret.skuNumber.isEmpty() || ret.skuNumber.equals("unknown") || ret.skuNumber.startsWith("tip.wlan_")) {
if ((ret.certificationRegion != null && !ret.certificationRegion.equals("unknown") ) && (ret.model != null && !ret.model.equals("unknown"))) {
if (ret.model.endsWith("-" + ret.certificationRegion)) {
updateColumns.put("sku_number", new Atom<>("TIP-" + ret.model));
ret.skuNumber = "TIP-" + ret.model;
} else {
updateColumns.put("sku_number", new Atom<>("TIP-" + ret.model + "-" + ret.certificationRegion));
ret.skuNumber = "TIP-" + ret.model + "-" + ret.certificationRegion;
}
} else if ((ret.country != null ) && (ret.model != null && !ret.model.equals("unknown"))) {
if (ret.model.endsWith("-" + ret.country)) {
updateColumns.put("sku_number", new Atom<>("TIP-" + ret.model));
ret.skuNumber = "TIP-" + ret.model;
} else {
updateColumns.put("sku_number", new Atom<>("TIP-" + ret.model + "-" + ret.country));
ret.skuNumber = "TIP-" + ret.model + "-" + ret.country;
}
} else if (ret.model != null && !ret.model.equals("unknown")){
updateColumns.put("sku_number", new Atom<>("TIP-" + ret.model));
ret.skuNumber = "TIP-" + ret.model;
}
}
// Configure the MQTT connection
@@ -337,8 +379,7 @@ public class OvsdbNode extends OvsdbDaoBase {
// mqtt_settings:ins:'["map",[["broker","testportal.123wlan.com"],["topics","/ap/dev-ap-0300/opensync"],["qos","0"],["port","1883"],["remote_log","1"]]]'
Map<String, String> newMqttSettings = new HashMap<>();
newMqttSettings.put("broker", mqttBrokerAddress);
String mqttClientName = OvsdbToWlanCloudTypeMappingUtility.getAlteredClientCnIfRequired(clientCn,
incomingConnectNodeInfo, preventCnAlteration);
String mqttClientName = OvsdbToWlanCloudTypeMappingUtility.getAlteredClientCnIfRequired(clientCn, incomingConnectNodeInfo, preventCnAlteration);
newMqttSettings.put("topics", "/ap/" + mqttClientName + "/opensync");
newMqttSettings.put("port", "" + mqttBrokerExternalPort);
newMqttSettings.put("compress", "zlib");
@@ -347,8 +388,8 @@ public class OvsdbNode extends OvsdbDaoBase {
if ((ret.mqttSettings == null) || !ret.mqttSettings.equals(newMqttSettings)) {
@SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> mgttSettings = com.vmware.ovsdb.protocol.operation.notation.Map
.of(newMqttSettings);
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> mgttSettings =
com.vmware.ovsdb.protocol.operation.notation.Map.of(newMqttSettings);
ret.mqttSettings = newMqttSettings;
updateColumns.put("mqtt_settings", mgttSettings);
}

View File

@@ -1,3 +1,4 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.ArrayList;
@@ -15,6 +16,8 @@ import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.Delete;
import com.vmware.ovsdb.protocol.operation.Insert;
import com.vmware.ovsdb.protocol.operation.Operation;
import com.vmware.ovsdb.protocol.operation.Update;
import com.vmware.ovsdb.protocol.operation.notation.Atom;
@@ -22,7 +25,9 @@ import com.vmware.ovsdb.protocol.operation.notation.Condition;
import com.vmware.ovsdb.protocol.operation.notation.Function;
import com.vmware.ovsdb.protocol.operation.notation.Row;
import com.vmware.ovsdb.protocol.operation.notation.Value;
import com.vmware.ovsdb.protocol.operation.result.InsertResult;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
import com.vmware.ovsdb.service.OvsdbClient;
@Component
@@ -33,8 +38,7 @@ public class OvsdbNodeConfig extends OvsdbDaoBase {
public void configureNtpServer(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
try {
ApNetworkConfiguration apNetworkConfig = (ApNetworkConfiguration) opensyncAPConfig.getApProfile()
.getDetails();
ApNetworkConfiguration apNetworkConfig = (ApNetworkConfiguration) opensyncAPConfig.getApProfile().getDetails();
if (apNetworkConfig.getNtpServer() == null || apNetworkConfig.getNtpServer().getValue() == null) {
LOG.info("Cannot configure NTP server to null value. {}", apNetworkConfig);
return;
@@ -43,8 +47,7 @@ public class OvsdbNodeConfig extends OvsdbDaoBase {
Map<String, Value> updateColumns = new HashMap<>();
updateColumns.put("value", new Atom<>(apNetworkConfig.getNtpServer().getValue()));
List<Operation> operations = new ArrayList<>();
operations.add(new Update(nodeConfigTable,
List.of(new Condition("module", Function.EQUALS, new Atom<>("ntp"))), new Row(updateColumns)));
operations.add(new Update(nodeConfigTable, List.of(new Condition("module", Function.EQUALS, new Atom<>("ntp"))), new Row(updateColumns)));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
@@ -54,4 +57,161 @@ public class OvsdbNodeConfig extends OvsdbDaoBase {
throw new RuntimeException(e);
}
}
public void configureSyslog(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
// /usr/opensync/tools/ovsh insert Node_Config module:="syslog" key:="remote" value:="udp:192.168.178.9:1000:4"
// The format is a colon delimited list. log_proto:log_ip:log_port:log_priority
try {
ApNetworkConfiguration apNetworkConfig = (ApNetworkConfiguration) opensyncAPConfig.getApProfile().getDetails();
if (apNetworkConfig.getSyslogRelay() == null) {
LOG.info("Cannot configure syslog to null value. {}", apNetworkConfig);
return;
}
if (apNetworkConfig.getSyslogRelay().isEnabled()) {
if (apNetworkConfig.getSyslogRelay().getSrvHostIp() == null || apNetworkConfig.getSyslogRelay().getSeverity() == null) {
LOG.info("Cannot configure syslog remote_logging without SrvHostIp and Severity values. {}", apNetworkConfig);
return;
}
LOG.debug("configureSyslog remote_logging to {}", apNetworkConfig.getSyslogRelay());
Map<String, Value> columns = new HashMap<>();
columns.put("key", new Atom<>("remote"));
columns.put("module", new Atom<>("syslog"));
String delimitedValue = "udp:" + apNetworkConfig.getSyslogRelay().getSrvHostIp().getHostAddress() + ":" + String.valueOf(
apNetworkConfig.getSyslogRelay().getSrvHostPort() + ":" + String.valueOf(apNetworkConfig.getSyslogRelay().getSeverity().getId()));
columns.put("value", new Atom<>(delimitedValue));
List<Operation> operations = new ArrayList<>();
operations.add(new Update(nodeConfigTable, List.of(new Condition("module", Function.EQUALS, new Atom<>("syslog"))), new Row(columns)));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
long numUpdates = 0;
for (OperationResult res : result) {
if (res instanceof UpdateResult) {
numUpdates += ((UpdateResult) res).getCount();
LOG.debug("configureSyslog update result {}", res);
}
}
if (numUpdates == 0) {
// no records existed, insert the row instead
operations.clear();
operations.add(new Insert(nodeConfigTable, new Row(columns)));
fResult = ovsdbClient.transact(ovsdbName, operations);
result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
LOG.debug("configureSyslog insert result {}", res);
}
}
} else {
LOG.debug("Disable remote_logging", apNetworkConfig.getSyslogRelay());
List<Operation> operations = new ArrayList<>();
operations.add(new Delete(nodeConfigTable, List.of(new Condition("module", Function.EQUALS, new Atom<>("syslog")))));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
if (res instanceof UpdateResult) {
LOG.debug("configureSyslog disabled remote_logging {}", res);
}
}
}
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
}
public void processLedControlEnabled(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
try {
Map<String, Value> columns = new HashMap<>();
ApNetworkConfiguration apNetworkConfig = (ApNetworkConfiguration) opensyncAPConfig.getApProfile()
.getDetails();
if (apNetworkConfig.isLedControlEnabled() == null) {
LOG.info("Cannot configure isLedControlEnabled to null value. {}", apNetworkConfig);
return;
}
if (apNetworkConfig.isLedControlEnabled()) {
columns.put("module", new Atom<>("led"));
columns.put("key", new Atom<>("led_state"));
columns.put("value", new Atom<>("on"));
} else {
columns.put("module", new Atom<>("led"));
columns.put("key", new Atom<>("led_state"));
columns.put("value", new Atom<>("off"));
}
List<Operation> operations = new ArrayList<>();
operations.add(new Update(nodeConfigTable,
List.of(new Condition("module", Function.EQUALS, new Atom<>("led"))), new Row(columns)));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
long numUpdates = 0;
for (OperationResult res : result) {
if (res instanceof UpdateResult) {
numUpdates += ((UpdateResult) res).getCount();
LOG.debug("processLedControlEnabled update result {}", res);
}
}
if (numUpdates == 0) {
// no records existed, insert the row instead
operations.clear();
operations.add(new Insert(nodeConfigTable, new Row(columns)));
fResult = ovsdbClient.transact(ovsdbName, operations);
result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
if (res instanceof InsertResult) {
LOG.debug("processLedControlEnabled insert result {}", res);
}
}
}
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
}
public String processBlinkRequest(OvsdbClient ovsdbClient, String apId, boolean blinkAllLEDs) {
String ret = null;
try {
LOG.debug("processLEDRequest set LEDs status to {}", blinkAllLEDs ? "led_blink" : "led_state");
Map<String, Value> columns = new HashMap<>();
if (blinkAllLEDs) {
columns.put("module", new Atom<>("led"));
columns.put("key", new Atom<>("led_blink"));
} else {
columns.put("module", new Atom<>("led"));
columns.put("key", new Atom<>("led_state"));
}
List<Operation> operations = new ArrayList<>();
operations.add(new Update(nodeConfigTable,
List.of(new Condition("module", Function.EQUALS, new Atom<>("led"))), new Row(columns)));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
long numUpdates = 0;
for (OperationResult res : result) {
if (res instanceof UpdateResult) {
numUpdates += ((UpdateResult) res).getCount();
LOG.debug("processBlinkRequest update result {}", res);
ret = "processBlinkRequest update result " + res;
}
}
if (numUpdates == 0) {
// no records existed, insert the row instead
operations.clear();
operations.add(new Insert(nodeConfigTable, new Row(columns)));
fResult = ovsdbClient.transact(ovsdbName, operations);
result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
if (res instanceof InsertResult) {
LOG.debug("processBlinkRequest insert result {}", res);
ret = "processBlinkRequest insert result " + res;
}
}
}
return ret;
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -1,8 +1,8 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import com.telecominfraproject.wlan.core.model.equipment.ChannelBandwidth;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.core.model.equipment.SourceType;
import com.telecominfraproject.wlan.equipment.models.*;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiRadioConfigInfo;
@@ -14,6 +14,7 @@ import com.vmware.ovsdb.protocol.operation.Operation;
import com.vmware.ovsdb.protocol.operation.Update;
import com.vmware.ovsdb.protocol.operation.notation.*;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.schema.DatabaseSchema;
import com.vmware.ovsdb.service.OvsdbClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -33,33 +34,158 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
OvsdbGet ovsdbGet;
void configureWifiRadios(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
String country = opensyncAPConfig.getCountryCode(); // should be the
// same for all
// radios on this AP
// ;-)
ApElementConfiguration apElementConfiguration = (ApElementConfiguration) opensyncAPConfig.getCustomerEquipment()
.getDetails();
ApElementConfiguration apElementConfiguration = (ApElementConfiguration) opensyncAPConfig.getCustomerEquipment().getDetails();
RfConfiguration rfConfig = (RfConfiguration) opensyncAPConfig.getRfProfile().getDetails();
Map<String, WifiRadioConfigInfo> provisionedRadioConfigs = ovsdbGet.getProvisionedWifiRadioConfigs(ovsdbClient);
Map<String, WifiVifConfigInfo> vifConfigs = ovsdbGet.getProvisionedWifiVifConfigs(ovsdbClient);
List<Operation> operations = new ArrayList<>();
try {
CompletableFuture<DatabaseSchema> cfDatabaseSchema = ovsdbClient.getSchema(ovsdbName);
DatabaseSchema databaseSchema = cfDatabaseSchema.get();
Set<String> columnNames = databaseSchema.getTables().get(wifiRadioConfigDbTable).getColumns().keySet();
for (RadioType radioType : apElementConfiguration.getRadioMap().keySet()) {
Map<String, String> hwConfig = new HashMap<>();
ElementRadioConfiguration elementRadioConfig = apElementConfiguration.getRadioMap().get(radioType);
RfElementConfiguration rfElementConfig = rfConfig.getRfConfig(radioType);
if (elementRadioConfig == null || rfElementConfig == null) {
continue;
}
boolean autoChannelSelection = rfElementConfig.getAutoChannelSelection();
int channel = elementRadioConfig.getActiveChannel(autoChannelSelection);
ChannelBandwidth bandwidth = rfElementConfig.getChannelBandwidth();
String ht_mode = getBandwidth(bandwidth);
RadioConfiguration radioConfig = apElementConfiguration.getAdvancedRadioMap().get(radioType);
int beaconInterval = rfElementConfig.getBeaconInterval();
boolean enabled = radioConfig.getRadioAdminState().equals(StateSetting.enabled);
boolean autoCellSizeSelection = rfElementConfig.getAutoCellSizeSelection();
int txPower = 0;
if (autoCellSizeSelection) {
if (elementRadioConfig.getEirpTxPower() != null) {
txPower = elementRadioConfig.getEirpTxPower().getValue();
}
} else {
txPower = rfElementConfig.getEirpTxPower();
}
String hwMode = getHwMode(rfElementConfig);
String freqBand = getHwConfigAndFreq(radioType, hwConfig);
String radioName = null;
for (String key : provisionedRadioConfigs.keySet()) {
if (provisionedRadioConfigs.get(key).freqBand.equals(freqBand)) {
radioName = key;
break;
}
}
LOG.debug(
"configureWifiRadios for AP {} autoChannelSelection={} activeChannel={} getChannelNumber={} radioName={} freqBand={} hwMode={} txPower={} enabled={} adminStateSetting={} autoCellSizeSelection={}",
opensyncAPConfig.getCustomerEquipment().getInventoryId(), autoChannelSelection, channel, elementRadioConfig.getChannelNumber(), radioName, freqBand, hwMode, txPower,
enabled, radioConfig.getRadioAdminState(), autoCellSizeSelection);
if (radioName == null)
continue;
String ifName = null; // for vifConfigs
if (radioName.equals(radio0)) {
ifName = defaultRadio0;
} else if (radioName.equals(radio1)) {
ifName = defaultRadio1;
} else if (radioName.equals(radio2)) {
ifName = defaultRadio2;
}
if (ifName == null)
continue;
Set<Uuid> vifUuidsForRadio = new HashSet<>();
for (String key : vifConfigs.keySet()) {
if (key.contains(ifName))
vifUuidsForRadio.add(vifConfigs.get(key).uuid);
}
int mimoMode = MimoMode.none.getId();
if (rfElementConfig.getMimoMode() != null) {
mimoMode = rfElementConfig.getMimoMode().getId();
}
int maxNumClients = 0;
if (rfElementConfig.getMaxNumClients() != null) {
maxNumClients = rfElementConfig.getMaxNumClients();
}
try {
configureWifiRadios(freqBand, channel, hwConfig, country.toUpperCase(), beaconInterval, enabled, hwMode, ht_mode, txPower, mimoMode,
vifUuidsForRadio, operations, maxNumClients,columnNames);
} catch (OvsdbClientException e) {
LOG.error("ConfigureWifiRadios failed with OvsdbClient exception.", e);
throw new RuntimeException(e);
} catch (TimeoutException e) {
LOG.error("ConfigureWifiRadios failed with Timeout.", e);
throw new RuntimeException(e);
} catch (ExecutionException e) {
LOG.error("ConfigureWifiRadios excecution failed.", e);
throw new RuntimeException(e);
} catch (InterruptedException e) {
LOG.error("ConfigureWifiRadios interrupted.", e);
throw new RuntimeException(e);
}
}
for (RadioType radioType : apElementConfiguration.getRadioMap().keySet()) {
Map<String, String> hwConfig = new HashMap<>();
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
LOG.trace("configureWifiRadios Op Result {}", res);
}
ovsdbGet.getProvisionedWifiRadioConfigs(ovsdbClient).entrySet().forEach(r -> {
LOG.debug("configureWifiRadios for AP {} Wifi_Radio_Config for if_name:{}\n{}", opensyncAPConfig.getCustomerEquipment().getInventoryId(), r.getKey(),r.getValue());
});
ElementRadioConfiguration elementRadioConfig = apElementConfiguration.getRadioMap().get(radioType);
RfElementConfiguration rfElementConfig = rfConfig.getRfConfig(radioType);
boolean autoChannelSelection = rfElementConfig.getAutoChannelSelection();
int channel = elementRadioConfig.getActiveChannel(autoChannelSelection);
LOG.debug("configureWifiRadios autoChannelSelection {} activeChannel {} getChannelNumber {} ",
autoChannelSelection, channel, elementRadioConfig.getChannelNumber());
ChannelBandwidth bandwidth = rfElementConfig.getChannelBandwidth();
String ht_mode;
switch (bandwidth) {
} catch (OvsdbClientException | ExecutionException | InterruptedException | TimeoutException e) {
LOG.error("configureWifiRadios error", e);
throw new RuntimeException(e);
}
}
String getHwConfigAndFreq(RadioType radioType, Map<String, String> hwConfig) {
switch (radioType) {
case is2dot4GHz:
return "2.4G";
case is5GHz:
// 802.11h dfs (Dynamic Frequency Selection) aka military
// and
// weather radar
// avoidance protocol
// Must not be disabled (by law)
// NA for 2.4GHz
hwConfig.put("dfs_enable", "1");
hwConfig.put("dfs_ignorecac", "0");
hwConfig.put("dfs_usenol", "1");
return "5G";
case is5GHzL:
// 802.11h dfs (Dynamic Frequency Selection) aka military
// and
// weather radar
// avoidance protocol
// Must not be disabled (by law)
// NA for 2.4GHz
hwConfig.put("dfs_enable", "1");
hwConfig.put("dfs_ignorecac", "0");
hwConfig.put("dfs_usenol", "1");
return "5GL";
case is5GHzU:
// 802.11h dfs (Dynamic Frequency Selection) aka military
// and
// weather radar
// avoidance protocol
// Must not be disabled (by law)
// NA for 2.4GHz
hwConfig.put("dfs_enable", "1");
hwConfig.put("dfs_ignorecac", "0");
hwConfig.put("dfs_usenol", "1");
return "5GU";
default: // don't know this interface
return null;
}
}
private String getBandwidth(ChannelBandwidth bandwidth) {
String ht_mode;
switch (bandwidth) {
case is20MHz:
ht_mode = "HT20";
break;
@@ -77,21 +203,13 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
break;
default:
ht_mode = null;
}
}
return ht_mode;
}
RadioConfiguration radioConfig = apElementConfiguration.getAdvancedRadioMap().get(radioType);
int beaconInterval = rfElementConfig.getBeaconInterval();
boolean enabled = radioConfig.getRadioAdminState().equals(StateSetting.enabled);
int txPower;
if (elementRadioConfig.getEirpTxPower().getSource() == SourceType.profile) {
txPower = rfElementConfig.getEirpTxPower();
} else {
txPower = elementRadioConfig.getEirpTxPower().getValue();
}
String hwMode = null;
switch (rfElementConfig.getRadioMode()) {
String getHwMode(RfElementConfiguration rfElementConfig) {
String hwMode = null;
switch (rfElementConfig.getRadioMode()) {
case modeA:
hwMode = "11a";
break;
@@ -113,137 +231,24 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
case modeN:
hwMode = "11n";
break;
case auto:
hwMode = "auto";
break;
default:
}
String freqBand;
switch (radioType) {
case is2dot4GHz:
freqBand = "2.4G";
break;
case is5GHz:
// 802.11h dfs (Dynamic Frequency Selection) aka military
// and
// weather radar
// avoidance protocol
// Must not be disabled (by law)
// NA for 2.4GHz
hwConfig.put("dfs_enable", "1");
hwConfig.put("dfs_ignorecac", "0");
hwConfig.put("dfs_usenol", "1");
freqBand = "5G";
break;
case is5GHzL:
// 802.11h dfs (Dynamic Frequency Selection) aka military
// and
// weather radar
// avoidance protocol
// Must not be disabled (by law)
// NA for 2.4GHz
hwConfig.put("dfs_enable", "1");
hwConfig.put("dfs_ignorecac", "0");
hwConfig.put("dfs_usenol", "1");
freqBand = "5GL";
break;
case is5GHzU:
// 802.11h dfs (Dynamic Frequency Selection) aka military
// and
// weather radar
// avoidance protocol
// Must not be disabled (by law)
// NA for 2.4GHz
hwConfig.put("dfs_enable", "1");
hwConfig.put("dfs_ignorecac", "0");
hwConfig.put("dfs_usenol", "1");
freqBand = "5GU";
break;
default: // don't know this interface
continue;
}
String radioName = null;
for (String key : provisionedRadioConfigs.keySet()) {
if (provisionedRadioConfigs.get(key).freqBand.equals(freqBand)) {
radioName = key;
break;
}
}
if (radioName == null) continue;
String ifName = null; // for vifConfigs
if (radioName.equals(radio0)) {
ifName = defaultRadio0;
} else if (radioName.equals(radio1)) {
ifName = defaultRadio1;
} else if (radioName.equals(radio2)) {
ifName = defaultRadio2;
}
if (ifName == null) continue;
Set<Uuid> vifUuidsForRadio = new HashSet<>();
for (String key : vifConfigs.keySet()) {
if (key.contains(ifName))
vifUuidsForRadio.add(vifConfigs.get(key).uuid);
}
int mimoMode = MimoMode.none.getId();
if (rfElementConfig.getMimoMode() != null) {
mimoMode = rfElementConfig.getMimoMode().getId();
}
try {
configureWifiRadios(freqBand, channel, hwConfig, country.toUpperCase(), beaconInterval,
enabled, hwMode, ht_mode, txPower, mimoMode, vifUuidsForRadio, operations);
} catch (OvsdbClientException e) {
LOG.error("ConfigureWifiRadios failed with OvsdbClient exception.", e);
throw new RuntimeException(e);
} catch (TimeoutException e) {
LOG.error("ConfigureWifiRadios failed with Timeout.", e);
throw new RuntimeException(e);
} catch (ExecutionException e) {
LOG.error("ConfigureWifiRadios excecution failed.", e);
throw new RuntimeException(e);
} catch (InterruptedException e) {
LOG.error("ConfigureWifiRadios interrupted.", e);
throw new RuntimeException(e);
}
}
try {
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
LOG.debug("Op Result {}", res);
}
} catch (OvsdbClientException | ExecutionException | InterruptedException | TimeoutException e) {
LOG.error("configureWifiRadios error", e); throw new RuntimeException(e);
}
return hwMode;
}
void configureWifiRadios(String freqBand, int channel, Map<String, String> hwConfig,
String country, int beaconInterval, boolean enabled, String hwMode, String ht_mode, int txPower,
int mimoMode, Set<Uuid> vifUuidsForRadio, List<Operation> operations) throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException {
void configureWifiRadios(String freqBand, int channel, Map<String, String> hwConfig, String country, int beaconInterval, boolean enabled, String hwMode,
String ht_mode, int txPower, int mimoMode, Set<Uuid> vifUuidsForRadio, List<Operation> operations, int maxNumClients, Set<String> tableColumns)
throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException {
Map<String, Value> updateColumns = new HashMap<>();
List<Condition> conditions = new ArrayList<>();
conditions.add(new Condition("freq_band", Function.EQUALS, new Atom<>(freqBand)));
updateColumns.put("channel", new Atom<>(channel));
updateColumns.put("country", new Atom<>(country));
@SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> hwConfigMap = com.vmware.ovsdb.protocol.operation.notation.Map
.of(hwConfig);
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> hwConfigMap = com.vmware.ovsdb.protocol.operation.notation.Map.of(hwConfig);
updateColumns.put("hw_config", hwConfigMap);
updateColumns.put("bcn_int", new Atom<>(beaconInterval));
updateColumns.put("enabled", new Atom<>(enabled));
@@ -260,38 +265,71 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
if (hwMode != null) {
updateColumns.put("hw_mode", new Atom<>(hwMode));
}
setTxAndRxChainmask(mimoMode, updateColumns);
configureCustomOptionsMap(maxNumClients, updateColumns);
setTxAndRxChainmask(mimoMode, updateColumns,tableColumns);
if (vifUuidsForRadio.size() > 0) {
com.vmware.ovsdb.protocol.operation.notation.Set vifConfigUuids = com.vmware.ovsdb.protocol.operation.notation.Set
.of(vifUuidsForRadio);
com.vmware.ovsdb.protocol.operation.notation.Set vifConfigUuids = com.vmware.ovsdb.protocol.operation.notation.Set.of(vifUuidsForRadio);
updateColumns.put("vif_configs", vifConfigUuids);
}
Row row = new Row(updateColumns);
operations.add(new Update(wifiRadioConfigDbTable, conditions, row));
}
void setTxAndRxChainmask(int mimoMode, Map<String, Value> updateColumns) {
void configureCustomOptionsMap(int maxNumClients, Map<String, Value> updateColumns) {
Map<String, String> customOptions = new HashMap<>();
customOptions.put("max_clients", String.valueOf(maxNumClients));
@SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> customOptionsMap = com.vmware.ovsdb.protocol.operation.notation.Map.of(customOptions);
updateColumns.put("custom_options", customOptionsMap);
}
void setTxAndRxChainmask(int mimoMode, Map<String, Value> updateColumns, Set<String> tableColumns) {
/*
* Chainmask is a bitmask, so map mimo mode values accordingly
* Note values 0, 1 remain unchanged
* Note values 0, 1 remain unchanged
*
* mimoMode bitmask
* 0 0
* 1 1
* 2 3
* 3 7
* 4 15
* mimoMode bitmask
* 0 0
* 1 1 1
* 2 3 2
* 3 7 4
* 4 15 8
* 5 31 16
* 6 63 32
* 7 127 64
* 8 255 128
*/
if (mimoMode == 2) {mimoMode = 3;}
else if (mimoMode == 3) {mimoMode = 7;}
else if (mimoMode == 4) {mimoMode = 15;}
switch (mimoMode) {
case 0: // unchanged
break;
case 1: // unchanged
break;
case 2:
mimoMode = 3;
break;
case 3:
mimoMode = 7;
break;
case 4:
mimoMode = 15;
break;
case 5:
mimoMode = 31;
break;
case 6:
mimoMode = 63;
break;
case 7:
mimoMode = 127;
break;
case 8:
mimoMode = 255;
break;
}
updateColumns.put("tx_chainmask", new Atom<>(mimoMode));
updateColumns.put("rx_chainmask", new Atom<>(mimoMode));
if (tableColumns.contains("rx_chainmask")) {
updateColumns.put("rx_chainmask", new Atom<>(mimoMode));
}
}
}

View File

@@ -0,0 +1,199 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.telecominfraproject.wlan.profile.network.models.RadiusProxyConfiguration;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.Delete;
import com.vmware.ovsdb.protocol.operation.Insert;
import com.vmware.ovsdb.protocol.operation.Operation;
import com.vmware.ovsdb.protocol.operation.Update;
import com.vmware.ovsdb.protocol.operation.notation.Atom;
import com.vmware.ovsdb.protocol.operation.notation.Row;
import com.vmware.ovsdb.protocol.operation.notation.Set;
import com.vmware.ovsdb.protocol.operation.notation.Value;
import com.vmware.ovsdb.protocol.operation.result.ErrorResult;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
import com.vmware.ovsdb.protocol.schema.DatabaseSchema;
import com.vmware.ovsdb.service.OvsdbClient;
@Component
public class OvsdbRadiusProxyConfig extends OvsdbDaoBase {
@Autowired
OvsdbGet getProvisionedData;
void configureApc(OvsdbClient ovsdbClient, Boolean enable, List<Operation> operations) {
try {
if (ovsdbClient.getSchema(ovsdbName).get().getTables().containsKey(apcConfigDbTable)) {
Map<String, Value> updateColumns = new HashMap<>();
updateColumns.put("enabled", new Atom<>(enable));
Row row = new Row(updateColumns);
Update update = new Update(apcConfigDbTable, row);
if (!operations.contains(update)) {
// only need to do 1 update of this kind
operations.add(new Update(apcConfigDbTable, row));
}
}
} catch (InterruptedException | ExecutionException | OvsdbClientException e) {
LOG.error("Exception getting schema for ovsdb.", e);
throw new RuntimeException(e);
}
}
void configureRadius(OvsdbClient ovsdbClient, OpensyncAPConfig apConfig) {
List<Operation> operations = new ArrayList<>();
try {
if (ovsdbClient.getSchema(ovsdbName).get().getTables().containsKey(radiusConfigDbTable)) {
configureRadiusServers(ovsdbClient, apConfig, operations);
}
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
LOG.error("Exception provisioning RadSecConfiguraitons.", e);
throw new RuntimeException(e);
}
}
/*
* root@OpenAp-ab1f4d:~# ovsdb-client list-columns Radius_Proxy_Config
*
* Column Type
* ------------------ ---------------------------------------------------------------
* realm {"key":{"maxLength":256,"type":"string"},"max":16,"min":0}
* radius_config_name "string"
* _uuid "uuid"
* acct_port {"key":"integer","min":0}
* client_key {"key":{"maxLength":256,"minLength":1,"type":"string"},"min":0}
* server "string"
* _version "uuid"
* port "integer"
* radsec "boolean"
* client_cert {"key":{"maxLength":256,"minLength":1,"type":"string"},"min":0}
* acct_server {"key":"string","min":0}
* passphrase {"key":{"maxLength":128,"type":"string"},"min":0}
* acct_secret {"key":"string","min":0}
* ca_cert {"key":{"maxLength":256,"minLength":1,"type":"string"},"min":0}
* auto_discover "boolean"
* secret "string"
*/
private void configureRadiusServers(OvsdbClient ovsdbClient, OpensyncAPConfig apConfig, List<Operation> operations)
throws OvsdbClientException, InterruptedException, ExecutionException, TimeoutException {
// TODO: remove the schema check when AP load available
DatabaseSchema databaseSchema = ovsdbClient.getSchema(ovsdbName).get();
for (RadiusProxyConfiguration rsc : ((ApNetworkConfiguration) apConfig.getApProfile().getDetails()).getRadiusProxyConfigurations()) {
Map<String, Value> updateColumns = new HashMap<>();
if (rsc.getServer() != null)
updateColumns.put("server", new Atom<>(rsc.getServer().getHostAddress()));
if (rsc.getName() != null)
updateColumns.put("radius_config_name", new Atom<>(rsc.getName()));
if (rsc.getPort() != null)
updateColumns.put("port", new Atom<>(rsc.getPort()));
if (rsc.getRealm() != null)
updateColumns.put("realm", Set.of(rsc.getRealm()));
if (rsc.getUseRadSec() != null) {
updateColumns.put("radsec", new Atom<>(rsc.getUseRadSec()));
if (rsc.getUseRadSec()) {
getCertificateUrls(rsc, updateColumns);
updateColumns.put("passphrase", new Atom<>(rsc.getPassphrase()));
}
}
if (rsc.getSharedSecret() != null)
updateColumns.put("secret", new Atom<>(rsc.getSharedSecret()));
if (rsc.getAcctServer() != null) {
updateColumns.put("acct_server", new Atom<>(rsc.getAcctServer().getHostAddress()));
}
if (rsc.getSharedSecret() != null) {
updateColumns.put("acct_secret", new Atom<>(rsc.getSharedSecret()));
}
if (rsc.getAcctPort() != null) {
updateColumns.put("acct_port", new Atom<>(rsc.getAcctPort()));
}
if (databaseSchema.getTables().get(radiusConfigDbTable).getColumns().containsKey("auto_discover")) {
if (rsc.getUseRadSec() != null && rsc.getUseRadSec() && rsc.getDynamicDiscovery() != null && rsc.getDynamicDiscovery()) {
// if useRadSec && dynamicDiscovery enabled, do not send server information
updateColumns.put("auto_discover", new Atom<>(true));
updateColumns.remove("acct_server");
updateColumns.remove("acct_secret");
updateColumns.remove("acct_port");
updateColumns.remove("server");
updateColumns.remove("port");
updateColumns.remove("secret");
} else {
// if !useRadSec, auto_discover is false regardless of it's desired setting
// retain server information
updateColumns.put("auto_discover", new Atom<>(false));
}
}
Row row = new Row(updateColumns);
operations.add(new Insert(radiusConfigDbTable, row));
}
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
if (LOG.isDebugEnabled()) {
LOG.debug("Insert into {}:", radiusConfigDbTable);
for (OperationResult res : result) {
LOG.debug("Op Result {}", res);
}
}
}
private void getCertificateUrls(RadiusProxyConfiguration rsc, Map<String, Value> updateColumns) {
String clientCertFilestoreUrl = externalFileStoreURL + rsc.getClientCert().getApExportUrl();
String clientKeyFilestoreUrl = externalFileStoreURL + rsc.getClientKey().getApExportUrl();
String caCertFilestoreUrl = externalFileStoreURL + rsc.getCaCert().getApExportUrl();
if (!clientCertFilestoreUrl.contains("filestore")) {
clientCertFilestoreUrl = externalFileStoreURL + "/filestore/" + rsc.getClientCert().getApExportUrl();
}
if (!clientKeyFilestoreUrl.contains("filestore")) {
clientKeyFilestoreUrl = externalFileStoreURL + "/filestore/" + rsc.getClientKey().getApExportUrl();
}
if (!caCertFilestoreUrl.contains("filestore")) {
caCertFilestoreUrl = externalFileStoreURL + "/filestore/" + rsc.getCaCert().getApExportUrl();
}
updateColumns.put("client_cert", new Atom<>(clientCertFilestoreUrl));
updateColumns.put("client_key", new Atom<>(clientKeyFilestoreUrl));
updateColumns.put("ca_cert", new Atom<>(caCertFilestoreUrl));
}
void removeRadiusConfigurations(OvsdbClient ovsdbClient) {
LOG.info("removeRadiusConfigurations from {}", radiusConfigDbTable);
try {
if (ovsdbClient.getSchema(ovsdbName).get().getTables().containsKey(radiusConfigDbTable)) {
List<Operation> operations = new ArrayList<>();
operations.add(new Delete(radiusConfigDbTable));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
LOG.info("Op Result {}", res);
if (res instanceof UpdateResult) {
LOG.info("removeRadiusConfigurations {}", res.toString());
} else if (res instanceof ErrorResult) {
LOG.error("removeRadiusConfigurations error {}", (res));
throw new RuntimeException("removeRadiusConfigurations " + ((ErrorResult) res).getError() + " " + ((ErrorResult) res).getDetails());
}
}
LOG.info("Removed all radius and realm configurations");
}
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
LOG.error("Error in removeRadiusConfigurations", e);
throw new RuntimeException(e);
}
}
}

View File

@@ -1,9 +1,11 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
@@ -12,10 +14,12 @@ import java.util.concurrent.TimeoutException;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.core.model.equipment.AutoOrManualValue;
import com.telecominfraproject.wlan.core.model.equipment.OBSSHopMode;
import com.telecominfraproject.wlan.core.model.equipment.RadioBestApSettings;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.core.model.equipment.SourceType;
import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration;
import com.telecominfraproject.wlan.equipment.models.CellSizeAttributes;
import com.telecominfraproject.wlan.equipment.models.ElementRadioConfiguration;
import com.telecominfraproject.wlan.equipment.models.ManagementRate;
import com.telecominfraproject.wlan.equipment.models.MulticastRate;
@@ -38,15 +42,16 @@ import com.vmware.ovsdb.protocol.operation.result.ErrorResult;
import com.vmware.ovsdb.protocol.operation.result.InsertResult;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
import com.vmware.ovsdb.protocol.schema.DatabaseSchema;
import com.vmware.ovsdb.service.OvsdbClient;
@Component
public class OvsdbRrmConfig extends OvsdbDaoBase {
void configureWifiRrm(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) {
ApElementConfiguration apElementConfig = (ApElementConfiguration) opensyncApConfig.getCustomerEquipment()
.getDetails();
ApElementConfiguration apElementConfig = (ApElementConfiguration) opensyncApConfig.getCustomerEquipment().getDetails();
RfConfiguration rfConfig = (RfConfiguration) opensyncApConfig.getRfProfile().getDetails();
for (RadioType radioType : apElementConfig.getRadioMap().keySet()) {
String freqBand = null;
if (radioType == RadioType.is2dot4GHz) {
@@ -66,28 +71,24 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
ElementRadioConfiguration elementRadioConfig = apElementConfig.getRadioMap().get(radioType);
RfElementConfiguration rfElementConfig = rfConfig.getRfConfig(radioType);
if (elementRadioConfig == null || rfElementConfig == null) {
continue; // don't have a radio of this kind in the map
continue; // don't have a radio of this kind in the map
}
boolean autoChannelSelection = rfElementConfig.getAutoChannelSelection();
int backupChannel = elementRadioConfig.getActiveBackupChannel(autoChannelSelection);
LOG.debug("configureWifiRadios autoChannelSelection {} activeBackupChannel {}",
autoChannelSelection, backupChannel);
AutoOrManualValue probeResponseThresholdDb = null;
AutoOrManualValue clientDisconnectThresholdDb = null;
boolean autoCellSizeSelection = rfElementConfig.getAutoCellSizeSelection();
Integer probeResponseThresholdDb = null;
Integer clientDisconnectThresholdDb = null;
if (elementRadioConfig.getProbeResponseThresholdDb() != null) {
probeResponseThresholdDb = getSourcedValue(elementRadioConfig.getProbeResponseThresholdDb().getSource(),
rfElementConfig.getProbeResponseThresholdDb(),
elementRadioConfig.getProbeResponseThresholdDb().getValue());
probeResponseThresholdDb = getSourcedValue(autoCellSizeSelection, rfElementConfig.getProbeResponseThresholdDb(),
elementRadioConfig.getProbeResponseThresholdDb().getValue());
}
if (elementRadioConfig.getClientDisconnectThresholdDb() != null) {
clientDisconnectThresholdDb = getSourcedValue(
elementRadioConfig.getClientDisconnectThresholdDb().getSource(),
rfElementConfig.getClientDisconnectThresholdDb(),
elementRadioConfig.getClientDisconnectThresholdDb().getValue());
clientDisconnectThresholdDb = getSourcedValue(autoCellSizeSelection, rfElementConfig.getClientDisconnectThresholdDb(),
elementRadioConfig.getClientDisconnectThresholdDb().getValue());
}
RadioConfiguration radioConfig = apElementConfig.getAdvancedRadioMap().get(radioType);
@@ -95,62 +96,30 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
ManagementRate managementRate = null;
RadioBestApSettings bestApSettings = null;
if (radioConfig != null) {
if (radioConfig.getMulticastRate() != null) {
multicastRate = radioConfig.getMulticastRate().getSource() == SourceType.profile
? rfElementConfig.getMulticastRate()
: radioConfig.getMulticastRate().getValue();
}
if (radioConfig.getManagementRate() != null) {
managementRate = radioConfig.getManagementRate().getSource() == SourceType.profile
? rfElementConfig.getManagementRate()
: radioConfig.getManagementRate().getValue();
}
if (radioConfig.getBestApSettings() != null) {
bestApSettings = radioConfig.getBestApSettings().getSource() == SourceType.profile
? rfElementConfig.getBestApSettings()
: radioConfig.getBestApSettings().getValue();
}
}
if (radioConfig.getMulticastRate() != null) {
multicastRate = autoCellSizeSelection ? radioConfig.getMulticastRate().getValue() : rfElementConfig.getMulticastRate();
}
int multicastRateMbps = 0;
if (multicastRate != null) {
switch (multicastRate) {
case rate6mbps:
multicastRateMbps = 6;
break;
case rate9mbps:
multicastRateMbps = 9;
break;
case rate12mbps:
multicastRateMbps = 12;
break;
case rate18mbps:
multicastRateMbps = 18;
break;
case rate24mbps:
multicastRateMbps = 24;
break;
case rate36mbps:
multicastRateMbps = 36;
break;
case rate48mbps:
multicastRateMbps = 48;
break;
case rate54mbps:
multicastRateMbps = 54;
break;
case auto:
default:
multicastRateMbps = 0;
if (radioConfig.getManagementRate() != null) {
managementRate = autoCellSizeSelection ? radioConfig.getManagementRate().getValue() : rfElementConfig.getManagementRate();
}
if (radioConfig.getBestApSettings() != null) {
bestApSettings = radioConfig.getBestApSettings().getSource() == SourceType.profile ? rfElementConfig.getBestApSettings()
: radioConfig.getBestApSettings().getValue();
}
}
OBSSHopMode obssHopMode = rfElementConfig.getChannelHopSettings().getObssHopMode();
int noiseFloorThresholdInDB = rfElementConfig.getChannelHopSettings().getNoiseFloorThresholdInDB();
int noiseFloorThresholdTimeInSeconds = rfElementConfig.getChannelHopSettings().getNoiseFloorThresholdTimeInSeconds();
int nonWifiThresholdInPercentage = rfElementConfig.getChannelHopSettings().getNonWifiThresholdInPercentage();
int nonWifiThresholdTimeInSeconds = rfElementConfig.getChannelHopSettings().getNonWifiThresholdTimeInSeconds();
if (freqBand != null) {
try {
configureWifiRrm(ovsdbClient, freqBand, backupChannel, probeResponseThresholdDb,
clientDisconnectThresholdDb, managementRate, bestApSettings, multicastRateMbps);
configureWifiRrm(ovsdbClient, freqBand, backupChannel, probeResponseThresholdDb, clientDisconnectThresholdDb, managementRate,
bestApSettings, multicastRate, obssHopMode, noiseFloorThresholdInDB, noiseFloorThresholdTimeInSeconds, nonWifiThresholdInPercentage,
nonWifiThresholdTimeInSeconds);
} catch (OvsdbClientException e) {
LOG.error("configureRrm failed with OvsdbClient exception.", e);
throw new RuntimeException(e);
@@ -167,37 +136,43 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
}
}
void configureWifiRrm(OvsdbClient ovsdbClient, String freqBand, int backupChannel,
AutoOrManualValue probeResponseThreshold, AutoOrManualValue clientDisconnectThreshold,
ManagementRate managementRate, RadioBestApSettings bestApSettings, int multicastRate)
void configureWifiRrm(OvsdbClient ovsdbClient, String freqBand, int backupChannel, Integer probeResponseThreshold, Integer clientDisconnectThreshold,
ManagementRate managementRate, RadioBestApSettings bestApSettings, MulticastRate multicastRate, OBSSHopMode obssHopMode,
int noiseFloorThresholdInDB, int noiseFloorThresholdTimeInSeconds, int nonWifiThresholdInPercentage, int nonWifiThresholdTimeInSeconds)
throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException {
CompletableFuture<DatabaseSchema> cfDatabaseSchema = ovsdbClient.getSchema(ovsdbName);
DatabaseSchema databaseSchema = cfDatabaseSchema.get();
Set<String> columnNames = databaseSchema.getTables().get(wifiRrmConfigDbTable).getColumns().keySet();
List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>();
updateColumns.put("freq_band", new Atom<>(freqBand));
updateColumns.put("backup_channel", new Atom<>(backupChannel));
if (ovsdbClient.getSchema(ovsdbName).get().getTables().get(wifiRadioConfigDbTable).getColumns()
.containsKey("mcast_rate")) {
updateColumns.put("mcast_rate", new Atom<>(multicastRate));
if (columnNames.contains("freq_band")) updateColumns.put("freq_band", new Atom<>(freqBand));
if (columnNames.contains("backup_channel")) updateColumns.put("backup_channel", new Atom<>(backupChannel));
if (columnNames.contains("mcast_rate")) {
if (multicastRate == null || multicastRate == MulticastRate.auto) {
updateColumns.put("mcast_rate", new Atom<>(0));
} else {
updateColumns.put("mcast_rate", new Atom<>(multicastRate.getId()));
}
}
if (probeResponseThreshold == null || probeResponseThreshold.isAuto()) {
updateColumns.put("probe_resp_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateColumns.put("probe_resp_threshold", new Atom<>(probeResponseThreshold.getValue()));
if (columnNames.contains("probe_resp_threshold")) {
if (probeResponseThreshold == null) {
updateColumns.put("probe_resp_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateColumns.put("probe_resp_threshold", new Atom<>(probeResponseThreshold.intValue()));
}
}
if (probeResponseThreshold == null || clientDisconnectThreshold.isAuto()) {
updateColumns.put("client_disconnect_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateColumns.put("client_disconnect_threshold", new Atom<>(clientDisconnectThreshold.getValue()));
if (columnNames.contains("client_disconnect_threshold")) {
if (clientDisconnectThreshold == null) {
updateColumns.put("client_disconnect_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateColumns.put("client_disconnect_threshold", new Atom<>(clientDisconnectThreshold.intValue()));
}
}
if (ovsdbClient.getSchema(ovsdbName).get().getTables().get(wifiRadioConfigDbTable).getColumns()
.containsKey("beacon_rate")) {
if (columnNames.contains("beacon_rate")) {
if (managementRate == null || managementRate == ManagementRate.auto) {
updateColumns.put("beacon_rate", new Atom<>(0));
} else {
@@ -205,22 +180,38 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
}
}
if (bestApSettings == null) {
updateColumns.put("min_load", new com.vmware.ovsdb.protocol.operation.notation.Set());
updateColumns.put("snr_percentage_drop", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
if (bestApSettings.getDropInSnrPercentage() == null) {
if (columnNames.contains("min_load") && columnNames.contains("snr_percentage_drop")) {
if (bestApSettings == null) {
updateColumns.put("min_load", new com.vmware.ovsdb.protocol.operation.notation.Set());
updateColumns.put("snr_percentage_drop", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateColumns.put("snr_percentage_drop", new Atom<>(bestApSettings.getDropInSnrPercentage()));
}
if (bestApSettings.getMinLoadFactor() == null) {
updateColumns.put("min_load", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateColumns.put("min_load", new Atom<>(bestApSettings.getMinLoadFactor()));
if (bestApSettings.getDropInSnrPercentage() == null) {
updateColumns.put("snr_percentage_drop", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateColumns.put("snr_percentage_drop", new Atom<>(bestApSettings.getDropInSnrPercentage()));
}
if (bestApSettings.getMinLoadFactor() == null) {
updateColumns.put("min_load", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateColumns.put("min_load", new Atom<>(bestApSettings.getMinLoadFactor()));
}
}
}
if (obssHopMode != null && columnNames.contains("obss_hop_mode"))
{
updateColumns.put("obss_hop_mode", new Atom<>(obssHopMode.equals(OBSSHopMode.NON_WIFI) ? 1 : 2));
}
if (columnNames.contains("noise_floor_thresh"))
updateColumns.put("noise_floor_thresh", new Atom<>(noiseFloorThresholdInDB));
if (columnNames.contains("noise_floor_time"))
updateColumns.put("noise_floor_time", new Atom<>(noiseFloorThresholdTimeInSeconds));
if (columnNames.contains("non_wifi_thresh"))
updateColumns.put("non_wifi_thresh", new Atom<>(nonWifiThresholdInPercentage));
if (columnNames.contains("non_wifi_time"))
updateColumns.put("non_wifi_time", new Atom<>(nonWifiThresholdTimeInSeconds));
Row row = new Row(updateColumns);
operations.add(new Insert(wifiRrmConfigDbTable, row));
@@ -238,10 +229,8 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
confirmRowExistsInTable(ovsdbClient, ((InsertResult) res).getUuid(), wifiRrmConfigDbTable);
} else if (res instanceof ErrorResult) {
LOG.error("configureWifiRrm error {}", (res));
throw new RuntimeException(
"configureWifiRrm " + ((ErrorResult) res).getError() + " " + ((ErrorResult) res).getDetails());
throw new RuntimeException("configureWifiRrm " + ((ErrorResult) res).getError() + " " + ((ErrorResult) res).getDetails());
}
}
}
@@ -254,8 +243,17 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
return AutoOrManualValue.createManualInstance(equipmentValue);
}
void processNewChannelsRequest(OvsdbClient ovsdbClient, Map<RadioType, Integer> backupChannelMap,
Map<RadioType, Integer> primaryChannelMap) {
// For cell size related attributes, the “manual" mode is not supported any more,
// user can create a new RF profile with desired values to achieve it
int getSourcedValue(boolean autoCellSizeSelection, int profileValue, int equipmentValue) {
if (autoCellSizeSelection) {
return equipmentValue;
} else {
return profileValue;
}
}
void processNewChannelsRequest(OvsdbClient ovsdbClient, Map<RadioType, Integer> backupChannelMap, Map<RadioType, Integer> primaryChannelMap) {
LOG.info("OvsdbDao::processNewChannelsRequest backup {} primary {}", backupChannelMap, primaryChannelMap);
try {
@@ -298,6 +296,87 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
}
void processCellSizeAttributesRequest(OvsdbClient ovsdbClient, Map<RadioType, CellSizeAttributes> cellSizeAttributesMap) {
LOG.info("OvsdbDao::processCellSizeAttributesRequest cellSizeAttributes {}", cellSizeAttributesMap);
try {
List<Operation> operations = new ArrayList<>();
cellSizeAttributesMap.entrySet().stream().forEach(c -> {
String freqBand = OvsdbToWlanCloudTypeMappingUtility.getOvsdbRadioFreqBandForRadioType(c.getKey());
List<Condition> conditions = new ArrayList<>();
conditions.add(new Condition("freq_band", Function.EQUALS, new Atom<>(freqBand)));
Map<String, Value> updateRrmColumns = new HashMap<>();
CellSizeAttributes cellSizeAttributes = c.getValue();
MulticastRate multicastRate = cellSizeAttributes.getMulticastRate();
if (multicastRate == null || multicastRate == MulticastRate.auto) {
updateRrmColumns.put("mcast_rate", new Atom<>(0));
} else {
updateRrmColumns.put("mcast_rate", new Atom<>(multicastRate.getId()));
}
Integer probeResponseThreshold = cellSizeAttributes.getProbeResponseThresholdDb();
if (probeResponseThreshold == null) {
updateRrmColumns.put("probe_resp_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateRrmColumns.put("probe_resp_threshold", new Atom<>(probeResponseThreshold.intValue()));
}
Integer clientDisconnectThreshold = cellSizeAttributes.getClientDisconnectThresholdDb();
if (clientDisconnectThreshold == null) {
updateRrmColumns.put("client_disconnect_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateRrmColumns.put("client_disconnect_threshold", new Atom<>(clientDisconnectThreshold.intValue()));
}
ManagementRate managementRate = cellSizeAttributes.getManagementRate();
if (managementRate == null || managementRate == ManagementRate.auto) {
updateRrmColumns.put("beacon_rate", new Atom<>(0));
} else {
updateRrmColumns.put("beacon_rate", new Atom<>(managementRate.getId() * 10));
}
Row rowRrm = new Row(updateRrmColumns);
operations.add(new Update(wifiRrmConfigDbTable, conditions, rowRrm));
Map<String, Value> updateRadioColumns = new HashMap<>();
Integer txPower = cellSizeAttributes.getEirpTxPowerDb();
if (txPower != null && txPower > 0) {
updateRadioColumns.put("tx_power", new Atom<>(txPower));
} else {
updateRadioColumns.put("tx_power", new com.vmware.ovsdb.protocol.operation.notation.Set());
}
Row rowRadio = new Row(updateRadioColumns);
operations.add(new Update(wifiRadioConfigDbTable, conditions, rowRadio));
});
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
LOG.info("Op Result {}", res);
if (res instanceof InsertResult) {
LOG.info("processCellSizeAttributesRequest insert new row result {}", (res));
// for insert, make sure it is actually in the table
confirmRowExistsInTable(ovsdbClient, ((InsertResult) res).getUuid(), wifiRrmConfigDbTable);
} else if (res instanceof ErrorResult) {
LOG.error("processCellSizeAttributesRequest error {}", (res));
throw new RuntimeException("processCellSizeAttributesRequest " + ((ErrorResult) res).getError() + " " + ((ErrorResult) res).getDetails());
}
}
LOG.info("Updated ovsdb config for cell size attributes.");
} catch (ExecutionException e) {
LOG.error("Error in processCellSizeAttributesRequest", e);
} catch (OvsdbClientException | TimeoutException | InterruptedException e) {
LOG.error("Error in processCellSizeAttributesRequest", e);
throw new RuntimeException(e);
}
}
void removeWifiRrm(OvsdbClient ovsdbClient) {
try {
List<Operation> operations = new ArrayList<>();

View File

@@ -1,3 +1,4 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
@@ -11,7 +12,10 @@ import com.telecominfraproject.wlan.profile.bonjour.models.BonjourGatewayProfile
import com.telecominfraproject.wlan.profile.bonjour.models.BonjourServiceSet;
import com.telecominfraproject.wlan.profile.captiveportal.models.CaptivePortalAuthenticationType;
import com.telecominfraproject.wlan.profile.captiveportal.models.CaptivePortalConfiguration;
import com.telecominfraproject.wlan.profile.captiveportal.user.models.TimedAccessUserRecord;
import com.telecominfraproject.wlan.profile.models.Profile;
import com.telecominfraproject.wlan.profile.models.common.FileCategory;
import com.telecominfraproject.wlan.profile.models.common.FileType;
import com.telecominfraproject.wlan.profile.models.common.ManagedFileInfo;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.telecominfraproject.wlan.profile.network.models.GreTunnelConfiguration;
@@ -31,6 +35,12 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.*;
import java.util.Set;
import java.util.Map.Entry;
@@ -49,6 +59,8 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
OvsdbNetworkConfig networkConfig;
@Autowired
OvsdbNode ovsdbNode;
@Autowired
OvsdbRadiusProxyConfig radsecConfig;
protected void getEnabledRadios(OvsdbClient ovsdbClient, List<RadioType> radios) {
try {
@@ -72,27 +84,26 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
}
}
if ((result != null) && (result.length > 0) && (result[0] instanceof SelectResult)
&& !((SelectResult) result[0]).getRows().isEmpty()) {
if ((result != null) && (result.length > 0) && (result[0] instanceof SelectResult) && !((SelectResult) result[0]).getRows().isEmpty()) {
for (Row row : ((SelectResult) result[0]).getRows()) {
String radioFrequencyBand = getSingleValueFromSet(row, "freq_band");
switch (radioFrequencyBand) {
case "2.4G":
radios.add(RadioType.is2dot4GHz);
break;
case "5G":
radios.add(RadioType.is5GHz);
break;
case "5GL":
radios.add(RadioType.is5GHzL);
break;
case "5GU":
radios.add(RadioType.is5GHzU);
break;
default:
LOG.debug("Unsupported or unrecognized radio band type {}", radioFrequencyBand);
case "2.4G":
radios.add(RadioType.is2dot4GHz);
break;
case "5G":
radios.add(RadioType.is5GHz);
break;
case "5GL":
radios.add(RadioType.is5GHzL);
break;
case "5GU":
radios.add(RadioType.is5GHzU);
break;
default:
LOG.debug("Unsupported or unrecognized radio band type {}", radioFrequencyBand);
}
@@ -146,8 +157,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @param dtimPeriod
* @param customOptions
*/
void configureCustomOptionsForDtimFragAnd80211k(boolean enable80211k, int dtimPeriod,
Map<String, String> customOptions) {
void configureCustomOptionsForDtimFragAnd80211k(boolean enable80211k, int dtimPeriod, Map<String, String> customOptions) {
customOptions.put("dtim_period", String.valueOf(dtimPeriod));
if (enable80211k) {
customOptions.put("ieee80211k", String.valueOf(1));
@@ -162,18 +172,24 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @param radiusNasId
* @param radiusNasIp
* @param radiusOperatorName
* @param enable80211r
* @param customOptions
*/
void configureCustomOptionsForRadiusNas(OvsdbClient ovsdbClient, String radiusNasId, String radiusNasIp,
String radiusOperatorName, Map<String, String> customOptions) {
void configureCustomOptionsForRadiusNas(OvsdbClient ovsdbClient, String radiusNasId, String radiusNasIp, String radiusOperatorName, boolean enable80211r,
Map<String, String> customOptions) {
ConnectNodeInfo partialConnectNode = new ConnectNodeInfo();
ovsdbNode.fillInWanIpAddressAndMac(ovsdbClient, partialConnectNode, defaultWanInterfaceType,
defaultWanInterfaceName);
ovsdbNode.fillInWanIpAddressAndMac(ovsdbClient, partialConnectNode, defaultWanInterfaceType, defaultWanInterfaceName);
if (radiusNasId != null) {
if (radiusNasId.equals(NasIdType.DEFAULT.toString())) {
if (enable80211r) {
LOG.info("NAS-ID is {}, 80211r is enabled, do not configure, AP will determine radius_nas_id when SSID configuration complete.", radiusNasId);
} else if (radiusNasId.equals(NasIdType.AP_BASE_MAC.toString())) {
LOG.info("NAS-ID is {}, set radius_nas_id to {}", radiusNasId, partialConnectNode.macAddress);
customOptions.put("radius_nas_id", partialConnectNode.macAddress);
} else if (radiusNasId.equals(NasIdType.DEFAULT.toString()) || radiusNasId.equals(NasIdType.BSSID.toString())) {
LOG.info("NAS-ID is {}, do not configure, AP will determine radius_nas_id when SSID configuration complete.", radiusNasId);
} else {
LOG.info("NAS-ID is USER_DEFINED, set radius_nas_id to provided value {}.", radiusNasId);
customOptions.put("radius_nas_id", radiusNasId);
}
}
@@ -190,7 +206,9 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
}
/**
*
* SSID UL/DL Limits from profile should be tagged against the client UL/DL limit
* ssid_ul_limit/ssid_dl_limit no longer used, set to 0 on AP to avoid unknown behaviours.
*
* @param rateLimitEnable
* @param ssidDlLimit
* @param ssidUlLimit
@@ -199,22 +217,28 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @param rtsCtsThreshold
* @param customOptions
*/
void configureCustomOptionsForRatesAndLimits(boolean rateLimitEnable, int ssidDlLimit, int ssidUlLimit,
int clientDlLimit, int clientUlLimit, int rtsCtsThreshold, Map<String, String> customOptions) {
void configureCustomOptionsForRatesAndLimits(boolean rateLimitEnable, int ssidDlLimit, int ssidUlLimit, int clientDlLimit, int clientUlLimit,
int rtsCtsThreshold, Map<String, String> customOptions) {
customOptions.put("rate_limit_en", rateLimitEnable ? "1" : "0");
customOptions.put("ssid_ul_limit", String.valueOf(ssidUlLimit * 1000));
customOptions.put("ssid_dl_limit", String.valueOf(ssidDlLimit * 1000));
customOptions.put("client_dl_limit", String.valueOf(clientDlLimit * 1000));
customOptions.put("client_ul_limit", String.valueOf(clientUlLimit * 1000));
customOptions.put("ssid_ul_limit", String.valueOf(0));
customOptions.put("ssid_dl_limit", String.valueOf(0));
customOptions.put("client_dl_limit", String.valueOf(ssidDlLimit * 1000));
customOptions.put("client_ul_limit", String.valueOf(ssidUlLimit * 1000));
customOptions.put("rts_threshold", String.valueOf(rtsCtsThreshold));
}
void configureCustomOptionsForUseRadiusProxyAndHotspot(boolean useRadiusProxy, boolean enableProxyArpForHotspot, Map<String, String> customOptions) {
customOptions.put("radproxy", useRadiusProxy ? "1" : "0");
customOptions.put("proxy_arp", enableProxyArpForHotspot ? "1" : "0");
}
/**
* Populate the various <K,V> fields in the custom_options column of the
* Wifi_VIF_Config ovsdb table.
*
* @param ovsdbClient
* @param enable80211k
* @param enable80211r TODO
* @param rateLimitEnable
* @param ssidDlLimit
* @param ssidUlLimit
@@ -227,107 +251,101 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @param radiusOperatorName
* @param updateColumns
* @param dynamicVlan
* @param useRadiusProxy
* @param enableProxyArpForHotspot TODO
*/
void configureCustomOptionsForSsid(OvsdbClient ovsdbClient, boolean enable80211k, boolean rateLimitEnable,
int ssidDlLimit, int ssidUlLimit, int clientDlLimit, int clientUlLimit, int rtsCtsThreshold,
int dtimPeriod, String radiusNasId, String radiusNasIp, String radiusOperatorName,
Map<String, Value> updateColumns, int dynamicVlan) {
void configureCustomOptionsForSsid(OvsdbClient ovsdbClient, boolean enable80211k, boolean enable80211r, boolean rateLimitEnable, int ssidDlLimit,
int ssidUlLimit, int clientDlLimit, int clientUlLimit, int rtsCtsThreshold, int dtimPeriod, String radiusNasId, String radiusNasIp,
String radiusOperatorName, Map<String, Value> updateColumns, int dynamicVlan, Boolean useRadiusProxy, Boolean enableProxyArpForHotspot) {
Map<String, String> customOptions = new HashMap<>();
configureCustomOptionsForRatesAndLimits(rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit,
rtsCtsThreshold, customOptions);
configureCustomOptionsForRadiusNas(ovsdbClient, radiusNasId, radiusNasIp, radiusOperatorName, customOptions);
configureCustomOptionsForUseRadiusProxyAndHotspot(useRadiusProxy, enableProxyArpForHotspot, customOptions);
configureCustomOptionsForRatesAndLimits(rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, rtsCtsThreshold, customOptions);
configureCustomOptionsForRadiusNas(ovsdbClient, radiusNasId, radiusNasIp, radiusOperatorName, enable80211r, customOptions);
configureCustomOptionsForDtimFragAnd80211k(enable80211k, dtimPeriod, customOptions);
configureCustomOptionsForDynamicVlan(dynamicVlan, customOptions);
@SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> customMap = com.vmware.ovsdb.protocol.operation.notation.Map
.of(customOptions);
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> customMap = com.vmware.ovsdb.protocol.operation.notation.Map.of(customOptions);
updateColumns.put("custom_options", customMap);
}
void configureSingleSsid(OvsdbClient ovsdbClient, String vifInterfaceName, String ssid, boolean ssidBroadcast,
Map<String, String> security, int vlanId, boolean rrmEnabled, boolean enable80211r,
int mobilityDomain, boolean enable80211v, boolean enable80211k, String minHwMode, boolean enabled,
int keyRefresh, boolean uapsdEnabled, boolean apBridge, NetworkForwardMode networkForwardMode,
List<MacAddress> macBlockList,
boolean rateLimitEnable, int ssidDlLimit, int ssidUlLimit, int clientDlLimit, int clientUlLimit,
int rtsCtsThreshold, int dtimPeriod, Map<String, String> captiveMap,
List<String> walledGardenAllowlist, String radiusNasId,
String radiusNasIp, String radiusOperatorName, String greTunnelName, int dynamicVlan, List<Operation> operations) {
void configureSingleSsid(OvsdbClient ovsdbClient, String vifInterfaceName, String ssid, boolean ssidBroadcast, Map<String, String> security, int vlanId,
boolean rrmEnabled, boolean enable80211r, int mobilityDomain, boolean enable80211v, boolean enable80211k, String minHwMode, boolean enabled,
int keyRefresh, boolean uapsdEnabled, boolean apBridge, NetworkForwardMode networkForwardMode, List<MacAddress> macBlockList,
boolean rateLimitEnable, int ssidDlLimit, int ssidUlLimit, int clientDlLimit, int clientUlLimit, int rtsCtsThreshold, int dtimPeriod,
Map<String, String> captiveMap, List<String> walledGardenAllowlist, String radiusNasId, String radiusNasIp, String radiusOperatorName,
String greTunnelName, int dynamicVlan, Boolean useRadiusProxy, List<Operation> operations, Boolean enableProxyArpForHotspot) {
Map<String, Value> updateColumns = new HashMap<>();
// If we are doing a NAT SSID, no bridge, else yes
// If gre tunnel and vlanId > 1 use vlan if name for bridge
String bridgeInterfaceName = defaultWanInterfaceName;
if (greTunnelName != null && vlanId > 1) {
bridgeInterfaceName = greTunnelName + "_" + vlanId;
} else if (networkForwardMode == NetworkForwardMode.NAT) {
bridgeInterfaceName = defaultLanInterfaceName;
}
// If we are doing a NAT SSID, no bridge, else yes
// If gre tunnel and vlanId > 1 use vlan if name for bridge
String bridgeInterfaceName = defaultWanInterfaceName;
if (greTunnelName != null && vlanId > 1) {
bridgeInterfaceName = greTunnelName + "_" + vlanId;
} else if (networkForwardMode == NetworkForwardMode.NAT) {
bridgeInterfaceName = defaultLanInterfaceName;
}
if (vlanId > 1) {
updateColumns.put("vlan_id", new Atom<>(vlanId));
} else {
updateColumns.put("vlan_id", new Atom<>(1));
}
if (vlanId > 1) {
updateColumns.put("vlan_id", new Atom<>(vlanId));
} else {
updateColumns.put("vlan_id", new Atom<>(1));
}
updateColumns.put("mode", new Atom<>("ap"));
@SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> captivePortalMap = com.vmware.ovsdb.protocol.operation.notation.Map
.of(captiveMap);
updateColumns.put("captive_portal", captivePortalMap);
updateColumns.put("mode", new Atom<>("ap"));
@SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> captivePortalMap = com.vmware.ovsdb.protocol.operation.notation.Map.of(captiveMap);
updateColumns.put("captive_portal", captivePortalMap);
if (walledGardenAllowlist != null && !walledGardenAllowlist.isEmpty()) {
Set<Atom<String>> atomMacList = new HashSet<>();
walledGardenAllowlist.forEach(allow -> atomMacList.add(new Atom<>(allow)));
com.vmware.ovsdb.protocol.operation.notation.Set allowListSet = com.vmware.ovsdb.protocol.operation.notation.Set
.of(atomMacList);
updateColumns.put("captive_allowlist", allowListSet);
} else {
updateColumns.put("captive_allowlist", new com.vmware.ovsdb.protocol.operation.notation.Set());
}
updateColumns.put("bridge", new Atom<>(bridgeInterfaceName));
if (enable80211v) {
updateColumns.put("btm", new Atom<>(1));
} else {
updateColumns.put("btm", new Atom<>(0));
}
updateColumns.put("enabled", new Atom<>(enabled));
if (enable80211r) {
updateColumns.put("ft_psk", new Atom<>(1));
updateColumns.put("ft_mobility_domain", new Atom<>(mobilityDomain));
} else {
updateColumns.put("ft_psk", new Atom<>(0));
updateColumns.put("ft_mobility_domain", new com.vmware.ovsdb.protocol.operation.notation.Set());
}
updateColumns.put("if_name", new Atom<>(vifInterfaceName));
updateColumns.put("rrm", new Atom<>(rrmEnabled ? 1 : 0));
updateColumns.put("ssid", new Atom<>(ssid));
updateColumns.put("ssid_broadcast", new Atom<>(ssidBroadcast ? "enabled" : "disabled"));
updateColumns.put("uapsd_enable", new Atom<>(uapsdEnabled));
updateColumns.put("min_hw_mode", new Atom<>(minHwMode));
updateColumns.put("group_rekey", new Atom<>(keyRefresh));
updateColumns.put("ap_bridge", new Atom<>(apBridge));
@SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> securityMap = com.vmware.ovsdb.protocol.operation.notation.Map
.of(security);
updateColumns.put("security", securityMap);
configureCustomOptionsForSsid(ovsdbClient, enable80211k, rateLimitEnable, ssidDlLimit, ssidUlLimit,
clientDlLimit, clientUlLimit, rtsCtsThreshold, dtimPeriod, radiusNasId,
radiusNasIp, radiusOperatorName, updateColumns, dynamicVlan);
updateBlockList(updateColumns, macBlockList);
Row row = new Row(updateColumns);
operations.add(new Insert(wifiVifConfigDbTable, row));
if (walledGardenAllowlist != null && !walledGardenAllowlist.isEmpty()) {
Set<Atom<String>> atomMacList = new HashSet<>();
walledGardenAllowlist.forEach(allow -> atomMacList.add(new Atom<>(allow)));
com.vmware.ovsdb.protocol.operation.notation.Set allowListSet = com.vmware.ovsdb.protocol.operation.notation.Set.of(atomMacList);
updateColumns.put("captive_allowlist", allowListSet);
} else {
updateColumns.put("captive_allowlist", new com.vmware.ovsdb.protocol.operation.notation.Set());
}
updateColumns.put("bridge", new Atom<>(bridgeInterfaceName));
if (enable80211v) {
updateColumns.put("btm", new Atom<>(1));
} else {
updateColumns.put("btm", new Atom<>(0));
}
updateColumns.put("enabled", new Atom<>(enabled));
if (enable80211r) {
updateColumns.put("ft_psk", new Atom<>(1));
updateColumns.put("ft_mobility_domain", new Atom<>(mobilityDomain));
} else {
updateColumns.put("ft_psk", new Atom<>(0));
updateColumns.put("ft_mobility_domain", new com.vmware.ovsdb.protocol.operation.notation.Set());
}
updateColumns.put("if_name", new Atom<>(vifInterfaceName));
updateColumns.put("rrm", new Atom<>(rrmEnabled ? 1 : 0));
updateColumns.put("ssid", new Atom<>(ssid));
updateColumns.put("ssid_broadcast", new Atom<>(ssidBroadcast ? "enabled" : "disabled"));
updateColumns.put("uapsd_enable", new Atom<>(uapsdEnabled));
updateColumns.put("min_hw_mode", new Atom<>(minHwMode));
updateColumns.put("group_rekey", new Atom<>(keyRefresh));
updateColumns.put("ap_bridge", new Atom<>(apBridge));
@SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> securityMap = com.vmware.ovsdb.protocol.operation.notation.Map.of(security);
updateColumns.put("security", securityMap);
configureCustomOptionsForSsid(ovsdbClient, enable80211k, enable80211r, rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit,
rtsCtsThreshold, dtimPeriod, radiusNasId, radiusNasIp, radiusOperatorName, updateColumns, dynamicVlan, useRadiusProxy, enableProxyArpForHotspot);
updateBlockList(updateColumns, macBlockList);
Row row = new Row(updateColumns);
operations.add(new Insert(wifiVifConfigDbTable, row));
}
void configureSsids(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) {
boolean rrmEnabled = false;
if ((opensyncApConfig.getEquipmentLocation() != null)
&& (opensyncApConfig.getEquipmentLocation().getDetails() != null)) {
if ((opensyncApConfig.getEquipmentLocation() != null) && (opensyncApConfig.getEquipmentLocation().getDetails() != null)) {
rrmEnabled = opensyncApConfig.getEquipmentLocation().getDetails().isRrmEnabled();
}
List<MacAddress> macBlockList = opensyncApConfig.getBlockedClients();
@@ -340,8 +358,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
for (Profile ssidProfile : opensyncApConfig.getSsidProfile()) {
SsidConfiguration ssidConfig = (SsidConfiguration) ssidProfile.getDetails();
ApElementConfiguration apElementConfig = (ApElementConfiguration) opensyncApConfig.getCustomerEquipment()
.getDetails();
ApElementConfiguration apElementConfig = (ApElementConfiguration) opensyncApConfig.getCustomerEquipment().getDetails();
RfConfiguration rfConfig = (RfConfiguration) opensyncApConfig.getRfProfile().getDetails();
for (RadioType radioType : ssidConfig.getAppliedRadios()) {
@@ -374,8 +391,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
clientUlLimit = ssidConfig.getClientBandwidthLimitUp();
}
Map<String, WifiRadioConfigInfo> provisionedRadioConfigs = getProvisionedData
.getProvisionedWifiRadioConfigs(ovsdbClient);
Map<String, WifiRadioConfigInfo> provisionedRadioConfigs = getProvisionedData.getProvisionedWifiRadioConfigs(ovsdbClient);
String freqBand = null;
String ifName = null;
String radioName = null;
@@ -429,9 +445,9 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
if (radioConfiguration != null) {
dtimPeriod = radioConfiguration.getDtimPeriod();
uapsdEnabled = radioConfiguration.getUapsdState() == StateSetting.enabled;
apBridge = radioConfiguration.getStationIsolation() == StateSetting.disabled; // stationIsolation
if (ssidConfig.getNoLocalSubnets()) apBridge = false; // no local access
}
String minHwMode = "11n"; // min_hw_mode is 11n
if (radioMode.equals(RadioMode.modeAC) && !radioType.equals(RadioType.is2dot4GHz)) {
minHwMode = "11ac";
@@ -454,8 +470,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
boolean enable80211k = true;
// off by default, only applicable for is2do4GHz
if ((ssidConfig.getRadioBasedConfigs() != null)
&& (ssidConfig.getRadioBasedConfigs().containsKey(radioType)
&& (ssidConfig.getRadioBasedConfigs().get(radioType) != null))) {
&& (ssidConfig.getRadioBasedConfigs().containsKey(radioType) && (ssidConfig.getRadioBasedConfigs().get(radioType) != null))) {
if (ssidConfig.getRadioBasedConfigs().get(radioType).getEnable80211r() != null) {
enable80211r = ssidConfig.getRadioBasedConfigs().get(radioType).getEnable80211r();
if (enable80211r) {
@@ -490,21 +505,18 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
int dynamicVlan = 0;
if (opensyncSecurityMode.endsWith("EAP")) {
if (ssidConfig.getRadiusClientConfiguration() != null) {
radiusNasId = ssidConfig.getRadiusClientConfiguration().getNasClientId()
.equals(NasIdType.USER_DEFINED)
? ssidConfig.getRadiusClientConfiguration().getUserDefinedNasId()
: ssidConfig.getRadiusClientConfiguration().getNasClientId().toString();
radiusNasIp = ssidConfig.getRadiusClientConfiguration().getNasClientIp()
.equals(NasIpType.USER_DEFINED)
? ssidConfig.getRadiusClientConfiguration().getUserDefinedNasIp()
: ssidConfig.getRadiusClientConfiguration().getNasClientIp().toString();
radiusNasId = ssidConfig.getRadiusClientConfiguration().getNasClientId().equals(NasIdType.USER_DEFINED)
? ssidConfig.getRadiusClientConfiguration().getUserDefinedNasId()
: ssidConfig.getRadiusClientConfiguration().getNasClientId().toString();
radiusNasIp = ssidConfig.getRadiusClientConfiguration().getNasClientIp().equals(NasIpType.USER_DEFINED)
? ssidConfig.getRadiusClientConfiguration().getUserDefinedNasIp()
: ssidConfig.getRadiusClientConfiguration().getNasClientIp().toString();
radiusOperName = ssidConfig.getRadiusClientConfiguration().getOperatorId();
} else {
radiusNasId = NasIdType.DEFAULT.toString();
radiusNasIp = NasIpType.WAN_IP.toString();
}
if (ssidConfig.getForwardMode() == null
|| ssidConfig.getForwardMode().equals(NetworkForwardMode.BRIDGE)) {
if (ssidConfig.getForwardMode() == null || ssidConfig.getForwardMode().equals(NetworkForwardMode.BRIDGE)) {
// get the dynamicVlan value for this ssid, when in
// bridge forward mode
// null implies bridge
@@ -522,9 +534,8 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
boolean enabled = ssidConfig.getSsidAdminState().equals(StateSetting.enabled);
int vlanId = ssidConfig.getVlanId() != null ? ssidConfig.getVlanId() : 1;
Optional<GreTunnelConfiguration> tunnelConfiguration = ((ApNetworkConfiguration) opensyncApConfig
.getApProfile().getDetails()).getGreTunnelConfigurations().stream()
.filter(t -> t.getVlanIdsInGreTunnel().contains(vlanId)).findFirst();
Optional<GreTunnelConfiguration> tunnelConfiguration = ((ApNetworkConfiguration) opensyncApConfig.getApProfile().getDetails())
.getGreTunnelConfigurations().stream().filter(t -> t.getVlanIdsInGreTunnel().contains(vlanId)).findFirst();
String greTunnelName = null;
if (tunnelConfiguration.isPresent()) {
greTunnelName = tunnelConfiguration.get().getGreTunnelName();
@@ -537,16 +548,27 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
interfacesPerFreqBand.put(freqBand, 1);
}
boolean useRadiusProxy = false;
if (ssidConfig.getUseRadiusProxy() != null) {
useRadiusProxy = ssidConfig.getUseRadiusProxy();
}
boolean enableProxyArpForHotspot = false;
if (ssidConfig.getEnableProxyArpForHotspot() != null) {
enableProxyArpForHotspot = ssidConfig.getEnableProxyArpForHotspot();
}
try {
configureSingleSsid(ovsdbClient, ifName, ssidConfig.getSsid(), ssidBroadcast,
security, vlanId, rrmEnabled, enable80211r, mobilityDomain, enable80211v,
enable80211k, minHwMode, enabled, keyRefresh, uapsdEnabled, apBridge,
ssidConfig.getForwardMode(), macBlockList,
rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, rtsCtsThreshold,
dtimPeriod, captiveMap, walledGardenAllowlist,
radiusNasId, radiusNasIp, radiusOperName, greTunnelName, dynamicVlan,operations);
configureSingleSsid(ovsdbClient, ifName, ssidConfig.getSsid(), ssidBroadcast, security, vlanId, rrmEnabled, enable80211r, mobilityDomain,
enable80211v, enable80211k, minHwMode, enabled, keyRefresh, uapsdEnabled, apBridge, ssidConfig.getForwardMode(), macBlockList,
rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, rtsCtsThreshold, dtimPeriod, captiveMap,
walledGardenAllowlist, radiusNasId, radiusNasIp, radiusOperName, greTunnelName, dynamicVlan, useRadiusProxy, operations, enableProxyArpForHotspot);
networkConfig.configureInetVifInterface(ovsdbClient, ifName, enabled, ssidConfig.getForwardMode(), operations);
if (useRadiusProxy) {
// make sure it's enabled if we are going to use it
radsecConfig.configureApc(ovsdbClient, useRadiusProxy, operations);
}
networkConfig.configureInetVifInterface(ovsdbClient, ifName, enabled, ssidConfig.getForwardMode(),operations );
} catch (IllegalStateException e) {
// could not provision this SSID, but still can go on
LOG.warn("could not provision SSID {} on {}", ssidConfig.getSsid(), freqBand);
@@ -564,19 +586,14 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
}
}
void getBonjourGatewayConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig,
Map<Short, Set<String>> bonjourServiceMap) {
if ((ssidConfig.getBonjourGatewayProfileId() != null)
&& (opensyncApConfig.getBonjourGatewayProfiles() != null)) {
void getBonjourGatewayConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Map<Short, Set<String>> bonjourServiceMap) {
if ((ssidConfig.getBonjourGatewayProfileId() != null) && (opensyncApConfig.getBonjourGatewayProfiles() != null)) {
for (Profile profileBonjour : opensyncApConfig.getBonjourGatewayProfiles()) {
if ((ssidConfig.getBonjourGatewayProfileId() == profileBonjour.getId())
&& (profileBonjour.getDetails() != null)) {
if ((ssidConfig.getBonjourGatewayProfileId() == profileBonjour.getId()) && (profileBonjour.getDetails() != null)) {
BonjourGatewayProfile bonjourGatewayConfiguration = (BonjourGatewayProfile) profileBonjour
.getDetails();
BonjourGatewayProfile bonjourGatewayConfiguration = (BonjourGatewayProfile) profileBonjour.getDetails();
Collection<BonjourServiceSet> bonjourServicesCollection = bonjourGatewayConfiguration
.getBonjourServices();
Collection<BonjourServiceSet> bonjourServicesCollection = bonjourGatewayConfiguration.getBonjourServices();
bonjourServicesCollection.forEach(b -> {
Set<String> serviceSet = new HashSet<>();
if (bonjourServiceMap.containsKey(b.getVlanId())) {
@@ -600,15 +617,15 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
*/
String getCaptiveAuthentication(CaptivePortalAuthenticationType authentication) {
switch (authentication) {
case guest:
return "None";
case username:
return "username";
case radius:
return "radius";
default:
LOG.error("Unsupported captive portal authentication {}", authentication);
return "None";
case guest:
return "None";
case username:
return "username";
case radius:
return "radius";
default:
LOG.error("Unsupported captive portal authentication {}", authentication);
return "None";
}
}
@@ -619,72 +636,61 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @param captiveMap
* @param walledGardenAllowlist
*/
void getCaptiveConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig,
Map<String, String> captiveMap, List<String> walledGardenAllowlist) {
void getCaptiveConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Map<String, String> captiveMap,
List<String> walledGardenAllowlist) {
if ((ssidConfig.getCaptivePortalId() != null) && (opensyncApConfig.getCaptiveProfiles() != null)) {
for (Profile profileCaptive : opensyncApConfig.getCaptiveProfiles()) {
if ((ssidConfig.getCaptivePortalId() == profileCaptive.getId())
&& (profileCaptive.getDetails() != null)) {
CaptivePortalConfiguration captiveProfileDetails = ((CaptivePortalConfiguration) profileCaptive
.getDetails());
if ((ssidConfig.getCaptivePortalId() == profileCaptive.getId()) && (profileCaptive.getDetails() != null)) {
CaptivePortalConfiguration captiveProfileDetails = ((CaptivePortalConfiguration) profileCaptive.getDetails());
// +#define SCHEMA_CONSTS_PAGE_TITLE "page_title"
if (captiveProfileDetails.getBrowserTitle() != null) {
captiveMap.put("session_timeout",
String.valueOf(captiveProfileDetails.getSessionTimeoutInMinutes()));
captiveMap.put("page_title", captiveProfileDetails.getBrowserTitle());
captiveMap.put("session_timeout", String.valueOf(captiveProfileDetails.getSessionTimeoutInMinutes()));
}
if (captiveProfileDetails.getAuthenticationType().equals(CaptivePortalAuthenticationType.radius)) {
Optional<Profile> optional = opensyncApConfig.getRadiusProfiles().stream()
.filter(p -> p.getId() == captiveProfileDetails.getRadiusServiceId()).findFirst();
Optional<Profile> optional =
opensyncApConfig.getRadiusProfiles().stream().filter(p -> p.getId() == captiveProfileDetails.getRadiusServiceId()).findFirst();
if (optional.isPresent()) {
Profile profile = optional.get();
RadiusProfile radiusProfile = (RadiusProfile) profile.getDetails();
captiveMap.put("radius_server_ip", String.valueOf(
radiusProfile.getPrimaryRadiusAuthServer().getIpAddress().getHostAddress()));
captiveMap.put("radius_server_ip", String.valueOf(radiusProfile.getPrimaryRadiusAuthServer().getIpAddress().getHostAddress()));
captiveMap.put("radius_server_port",
String.valueOf(radiusProfile.getPrimaryRadiusAuthServer().getPort()));
captiveMap.put("radius_server_port", String.valueOf(radiusProfile.getPrimaryRadiusAuthServer().getPort()));
captiveMap.put("radius_server_secret",
String.valueOf(radiusProfile.getPrimaryRadiusAuthServer().getSecret()));
captiveMap.put("radius_server_secret", String.valueOf(radiusProfile.getPrimaryRadiusAuthServer().getSecret()));
if (captiveProfileDetails.getRadiusAuthMethod() != null) {
captiveMap.put("radius_auth_type",
String.valueOf(captiveProfileDetails.getRadiusAuthMethod()));
captiveMap.put("radius_auth_type", String.valueOf(captiveProfileDetails.getRadiusAuthMethod()));
}
}
}
if (captiveProfileDetails.getRedirectURL() != null) {
captiveMap.put("redirect_url", captiveProfileDetails.getRedirectURL());
}
captiveMap.put("session_timeout",
String.valueOf(captiveProfileDetails.getSessionTimeoutInMinutes()));
captiveMap.put("session_timeout", String.valueOf(captiveProfileDetails.getSessionTimeoutInMinutes()));
captiveMap.put("browser_title", captiveProfileDetails.getBrowserTitle());
captiveMap.put("splash_page_title", captiveProfileDetails.getHeaderContent());
captiveMap.put("acceptance_policy", captiveProfileDetails.getUserAcceptancePolicy());
captiveMap.put("login_success_text", captiveProfileDetails.getSuccessPageMarkdownText());
captiveMap.put("authentication",
getCaptiveAuthentication(captiveProfileDetails.getAuthenticationType()));
if (captiveProfileDetails.getUsernamePasswordFile() != null) {
captiveMap
.put("username_password_file",
ManagedFileInfo.resolveWithPopulatedHostname(
captiveProfileDetails.getUsernamePasswordFile(), externalFileStoreURL)
.getApExportUrl());
}
captiveMap.put("authentication", getCaptiveAuthentication(captiveProfileDetails.getAuthenticationType()));
if (captiveProfileDetails.getLogoFile() != null) {
captiveMap.put("splash_page_logo", ManagedFileInfo
.resolveWithPopulatedHostname(captiveProfileDetails.getLogoFile(), externalFileStoreURL)
.getApExportUrl());
String splashLogoUrl = externalFileStoreURL + captiveProfileDetails.getLogoFile().getApExportUrl();
captiveMap.put("splash_page_logo", splashLogoUrl);
}
if (captiveProfileDetails.getBackgroundFile() != null) {
captiveMap.put("splash_page_background_logo",
ManagedFileInfo.resolveWithPopulatedHostname(captiveProfileDetails.getBackgroundFile(),
externalFileStoreURL).getApExportUrl());
String splashBackgroundUrl = externalFileStoreURL + captiveProfileDetails.getBackgroundFile().getApExportUrl();
captiveMap.put("splash_page_background_logo", splashBackgroundUrl);
}
if (captiveProfileDetails.getAuthenticationType().equals(CaptivePortalAuthenticationType.username)) {
// create a user/password file for the AP to pull
Path userFilepath = createCaptivePortalUserFile(captiveProfileDetails.getUserList(), profileCaptive.getId());
ManagedFileInfo mfi = new ManagedFileInfo();
mfi.setFileCategory(FileCategory.UsernamePasswordList);
mfi.setFileType(FileType.TEXT);
mfi.setApExportUrl(userFilepath.getFileName().toString());
String usernamePasswordFileUrl = externalFileStoreURL + mfi.getApExportUrl();
captiveMap.put("username_password_file", usernamePasswordFileUrl);
}
LOG.debug("captiveMap {}", captiveMap);
walledGardenAllowlist.addAll(captiveProfileDetails.getWalledGardenAllowlist());
@@ -693,6 +699,34 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
}
}
Path createCaptivePortalUserFile(List<TimedAccessUserRecord> userList, long captivePortalProfileId) {
Path path = Paths.get(fileStoreDirectoryName + File.separator + "captive-portal-users-" + captivePortalProfileId + ".txt");
try {
Files.deleteIfExists(path);
} catch (Exception e) {
LOG.error("Cannot delete {}", path, e);
}
for (TimedAccessUserRecord userRecord : userList) {
byte[] bytes = ("username=" + userRecord.getUsername() + ", password=" + userRecord.getPassword() + ", firstname="
+ userRecord.getUserDetails().getFirstName() + ", lastname=" + userRecord.getUserDetails().getLastName() + System.lineSeparator())
.getBytes();
try {
Files.write(path, bytes, StandardOpenOption.APPEND);
LOG.debug("Successfully written data to the file {}", path);
} catch (IOException e) {
try {
Files.write(path, bytes);
} catch (IOException e1) {
throw new RuntimeException(e1);
}
}
}
return path;
}
/**
* Maps between the osvdb security definitions and the cloud's security mode
* for the give SSID being configured.
@@ -727,82 +761,70 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
case "wpa3MixedEAP":
opensyncSecurityMode = "WPA3-EAP";
break;
case "wpa3OnlyEAP192":
opensyncSecurityMode = "WPA3-EAP-192";
break;
}
return opensyncSecurityMode;
}
void getRadiusAccountingConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig,
Map<String, String> security) {
void getRadiusAccountingConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Map<String, String> security) {
LOG.debug("getRadiusAccountingConfiguration for ssidConfig {} from radiusProfiles {}", ssidConfig,
opensyncApConfig.getRadiusProfiles());
LOG.debug("getRadiusAccountingConfiguration for ssidConfig {} from radiusProfiles {}", ssidConfig, opensyncApConfig.getRadiusProfiles());
LOG.debug("Radius Accounting Profiles {}", opensyncApConfig.getRadiusProfiles());
List<Profile> radiusProfileList = opensyncApConfig.getRadiusProfiles().stream()
.filter(t -> t.getId() == ssidConfig.getRadiusServiceId()).collect(Collectors.toList());
List<Profile> radiusProfileList =
opensyncApConfig.getRadiusProfiles().stream().filter(t -> t.getId() == ssidConfig.getRadiusServiceId()).collect(Collectors.toList());
if (radiusProfileList.size() > 0) {
Profile profileRadius = radiusProfileList.get(0);
RadiusProfile profileDetails = ((RadiusProfile) profileRadius.getDetails());
RadiusServer rServer = profileDetails.getPrimaryRadiusAccountingServer();
if (rServer != null) {
security.put("radius_acct_ip",
rServer.getIpAddress() != null ? rServer.getIpAddress().getHostAddress() : null);
security.put("radius_acct_ip", rServer.getIpAddress() != null ? rServer.getIpAddress().getHostAddress() : null);
security.put("radius_acct_port", rServer.getPort() != null ? String.valueOf(rServer.getPort()) : null);
security.put("radius_acct_secret", rServer.getSecret());
if (ssidConfig.getRadiusAcountingServiceInterval() != null) {
if (ssidConfig.getRadiusAcountingServiceInterval() != null && ssidConfig.getRadiusAcountingServiceInterval() > 0) {
// if the value is present, use the
// radius_acct_interval
security.put("radius_acct_interval", ssidConfig.getRadiusAcountingServiceInterval().toString());
} else {
LOG.info("No radius_acct_interval defined for ssid {}, Setting radius_acct_interval to 0",
ssidConfig.getSsid());
security.put("radius_acct_interval", "0");
}
LOG.info(
"set Radius Accounting server attributes radius_acct_ip {} radius_acct_port {} radius_acct_secret {} radius_acct_interval {}",
security.get("radius_acct_ip"), security.get("radius_acct_port"),
security.get("radius_acct_secret"), security.get("radius_acct_interval"));
LOG.info("set Radius Accounting server attributes radius_acct_ip {} radius_acct_port {} radius_acct_secret {} radius_acct_interval {}",
security.get("radius_acct_ip"), security.get("radius_acct_port"), security.get("radius_acct_secret"),
security.get("radius_acct_interval"));
} else {
LOG.info("No Radius Accounting Server defined in Radius Profile");
}
} else {
LOG.warn("Could not find radius profile {} in {}", ssidConfig.getRadiusServiceId(),
opensyncApConfig.getRadiusProfiles());
LOG.warn("Could not find radius profile {} in {}", ssidConfig.getRadiusServiceId(), opensyncApConfig.getRadiusProfiles());
}
}
void getRadiusConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig,
Map<String, String> security) {
void getRadiusConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Map<String, String> security) {
LOG.debug("getRadiusConfiguration for ssidConfig {} from radiusProfiles {}", ssidConfig,
opensyncApConfig.getRadiusProfiles());
LOG.debug("getRadiusConfiguration for ssidConfig {} from radiusProfiles {}", ssidConfig, opensyncApConfig.getRadiusProfiles());
LOG.debug("Radius Profiles {}", opensyncApConfig.getRadiusProfiles());
List<Profile> radiusProfileList = opensyncApConfig.getRadiusProfiles().stream()
.filter(t -> t.getId() == ssidConfig.getRadiusServiceId()).collect(Collectors.toList());
List<Profile> radiusProfileList =
opensyncApConfig.getRadiusProfiles().stream().filter(t -> t.getId() == ssidConfig.getRadiusServiceId()).collect(Collectors.toList());
if (radiusProfileList.size() > 0) {
Profile profileRadius = radiusProfileList.get(0);
RadiusProfile profileDetails = ((RadiusProfile) profileRadius.getDetails());
RadiusServer radiusServer = profileDetails.getPrimaryRadiusAuthServer();
security.put("radius_server_ip",
radiusServer.getIpAddress() != null ? radiusServer.getIpAddress().getHostAddress() : null);
security.put("radius_server_port",
radiusServer.getPort() != null ? String.valueOf(radiusServer.getPort()) : null);
security.put("radius_server_secret", radiusServer.getSecret());
LOG.info("set Radius server attributes radius_server_ip {} radius_server_port {} radius_server_secret {}",
security.get("radius_server_ip"), security.get("radius_server_port"),
security.get("radius_server_secret"));
security.put("radius_server_ip", radiusServer.getIpAddress() != null ? radiusServer.getIpAddress().getHostAddress() : null);
security.put("radius_server_port", radiusServer.getPort() != null ? String.valueOf(radiusServer.getPort()) : null);
security.put("radius_server_secret", radiusServer.getSecret());
LOG.info("set Radius server attributes radius_server_ip {} radius_server_port {} radius_server_secret {}", security.get("radius_server_ip"),
security.get("radius_server_port"), security.get("radius_server_secret"));
} else {
LOG.warn("Could not find radius profile {} in {}", ssidConfig.getRadiusServiceId(),
opensyncApConfig.getRadiusProfiles());
LOG.warn("Could not find radius profile {} in {}", ssidConfig.getRadiusServiceId(), opensyncApConfig.getRadiusProfiles());
}
}
@@ -816,8 +838,8 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @param ssidSecurityMode
* @param opensyncSecurityMode
*/
void populateSecurityMap(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig,
Map<String, String> security, String ssidSecurityMode, String opensyncSecurityMode) {
void populateSecurityMap(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Map<String, String> security, String ssidSecurityMode,
String opensyncSecurityMode) {
security.put("encryption", opensyncSecurityMode);
// key and mode is N/A for OPEN security
if (!opensyncSecurityMode.equals("OPEN")) {
@@ -843,28 +865,41 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
case "wpa2OnlyEAP":
case "wpa2OnlyRadius":
security.put("mode", "2");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
if (!ssidConfig.getUseRadiusProxy()) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
break;
case "wpa3OnlyEAP":
security.put("mode", "3");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
if (!ssidConfig.getUseRadiusProxy()) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
break;
case "wpa3OnlyEAP192":
security.put("mode", "3");
if (!ssidConfig.getUseRadiusProxy()) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
break;
case "wpa2EAP":
case "wpa2Radius":
case "wpa3MixedEAP":
security.put("mode", "mixed");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
if (!ssidConfig.getUseRadiusProxy()) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
break;
case "wpaEAP":
case "wpaRadius":
security.put("mode", "1");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
if (!ssidConfig.getUseRadiusProxy()) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
break;
}
}
@@ -887,18 +922,14 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
LOG.info("removeAllSsids:result {}", res.toString());
} else if (res instanceof ErrorResult) {
LOG.error("removeAllSsids:result error {}", (res));
throw new RuntimeException("removeAllSsids " + ((ErrorResult) res).getError() + " "
+ ((ErrorResult) res).getDetails());
throw new RuntimeException("removeAllSsids " + ((ErrorResult) res).getError() + " " + ((ErrorResult) res).getDetails());
}
}
Map<String, WifiVifConfigInfo> provisionedVifConfigs = getProvisionedData
.getProvisionedWifiVifConfigs(ovsdbClient);
Map<String, WifiVifConfigInfo> provisionedVifConfigs = getProvisionedData.getProvisionedWifiVifConfigs(ovsdbClient);
// this should be empty
if (!provisionedVifConfigs.isEmpty()) {
throw new RuntimeException(
"Failed to remove all vif configurations from Wifi_VIF_Config dbTable, still has "
+ provisionedVifConfigs.values());
throw new RuntimeException("Failed to remove all vif configurations from Wifi_VIF_Config dbTable, still has " + provisionedVifConfigs.values());
}
LOG.info("Removed all ssids");
@@ -918,8 +949,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
for (MacAddress mac : macBlockList) {
atomMacList.add(new Atom<>(mac.getAddressAsString()));
}
com.vmware.ovsdb.protocol.operation.notation.Set macListSet = com.vmware.ovsdb.protocol.operation.notation.Set
.of(atomMacList);
com.vmware.ovsdb.protocol.operation.notation.Set macListSet = com.vmware.ovsdb.protocol.operation.notation.Set.of(atomMacList);
updateColumns.put("mac_list", macListSet);
} else {
updateColumns.put("mac_list_type", new Atom<>("none"));

View File

@@ -63,7 +63,6 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
provisionWifiStatsConfigClient(radioConfigs, ovsdbGet.getProvisionedWifiStatsConfigs(ovsdbClient),
operations);
if (!operations.isEmpty()) {
LOG.debug("Sending batch of operations : {} ", operations);
@@ -78,11 +77,7 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
}
}
}
// TODO: when schema support is added, these should be part of the
// bulk provisioning operation above.
provisionVideoVoiceStats(ovsdbClient);
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
@@ -106,7 +101,7 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>();
updateColumns.put("reporting_interval", new Atom<>(60));
updateColumns.put("reporting_interval", new Atom<>(defaultReportingIntervalSeconds));
updateColumns.put("radio_type", new Atom<>("2.4G"));
updateColumns.put("stats_type", new Atom<>("network_probe"));
@@ -197,7 +192,7 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
List<Operation> operations = new ArrayList<>();
Map<String, Value> rowColumns = new HashMap<>();
rowColumns.put("radio_type", new Atom<>("2.4G"));
rowColumns.put("reporting_interval", new Atom<>(60));
rowColumns.put("reporting_interval", new Atom<>(defaultReportingIntervalSeconds));
rowColumns.put("report_type", new Atom<>("raw"));
rowColumns.put("sampling_interval", new Atom<>(10));
rowColumns.put("stats_type", new Atom<>("video_voice"));
@@ -244,11 +239,10 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
//
Map<String, Value> rowColumns = new HashMap<>();
rowColumns.put("radio_type", new Atom<>(rc.freqBand));
rowColumns.put("reporting_interval", new Atom<>(60));
rowColumns.put("reporting_interval", new Atom<>(defaultReportingIntervalSeconds));
rowColumns.put("report_type", new Atom<>("raw"));
rowColumns.put("sampling_interval", new Atom<>(10));
rowColumns.put("stats_type", new Atom<>("client"));
rowColumns.put("survey_interval_ms", new Atom<>(65));
Row updateRow = new Row(rowColumns);
operations.add(new Insert(wifiStatsConfigDbTable, updateRow));
@@ -258,6 +252,7 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
}
void provisionWifiStatsConfigNeighbor(Map<String, Set<Integer>> allowedChannels,
Map<String, WifiRadioConfigInfo> radioConfigs, Map<String, WifiStatsConfigInfo> provisionedWifiStatsConfigs,
List<Operation> operations) {
@@ -277,9 +272,10 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
rowColumns.put("channel_list", channels);
rowColumns.put("radio_type", new Atom<>(rc.freqBand));
rowColumns.put("reporting_interval", new Atom<>(60));
rowColumns.put("reporting_interval", new Atom<>(defaultOffChannelReportingIntervalSeconds));
rowColumns.put("stats_type", new Atom<>("neighbor"));
rowColumns.put("survey_type", new Atom<>("off-chan"));
rowColumns.put("survey_interval_ms", new Atom<>(10));
Row updateRow = new Row(rowColumns);
operations.add(new Insert(wifiStatsConfigDbTable, updateRow));
@@ -296,9 +292,10 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
//
Map<String, Value> rowColumns = new HashMap<>();
rowColumns.put("radio_type", new Atom<>(rc.freqBand));
rowColumns.put("reporting_interval", new Atom<>(60));
rowColumns.put("reporting_interval", new Atom<>(defaultReportingIntervalSeconds));
rowColumns.put("stats_type", new Atom<>("neighbor"));
rowColumns.put("survey_type", new Atom<>("on-chan"));
rowColumns.put("survey_interval_ms", new Atom<>(0));
Row updateRow = new Row(rowColumns);
operations.add(new Insert(wifiStatsConfigDbTable, updateRow));
@@ -321,7 +318,7 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
Map<String, Value> rowColumns = new HashMap<>();
rowColumns.put("radio_type", new Atom<>(rc.freqBand));
rowColumns.put("reporting_interval", new Atom<>(60));
rowColumns.put("reporting_interval", new Atom<>(defaultReportingIntervalSeconds));
rowColumns.put("report_type", new Atom<>("raw"));
rowColumns.put("sampling_interval", new Atom<>(10));
rowColumns.put("stats_type", new Atom<>("survey"));
@@ -350,12 +347,12 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
rowColumns.put("channel_list", channels);
rowColumns.put("radio_type", new Atom<>(rc.freqBand));
rowColumns.put("reporting_interval", new Atom<>(120));
rowColumns.put("reporting_interval", new Atom<>(defaultOffChannelReportingIntervalSeconds));
rowColumns.put("report_type", new Atom<>("raw"));
rowColumns.put("stats_type", new Atom<>("survey"));
rowColumns.put("survey_type", new Atom<>("off-chan"));
rowColumns.put("sampling_interval", new Atom<>(10));
rowColumns.put("survey_interval_ms", new Atom<>(50));
rowColumns.put("survey_interval_ms", new Atom<>(120));
rowColumns.put("threshold", thresholds);
Row updateRow = new Row(rowColumns);
operations.add(new Insert(wifiStatsConfigDbTable, updateRow));

View File

@@ -0,0 +1,101 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao.models;
import java.util.Objects;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDaoBase;
import com.vmware.ovsdb.protocol.operation.notation.Row;
import java.util.Set;
import com.vmware.ovsdb.protocol.operation.notation.Uuid;
public class RadiusProxyConfigInfo implements Cloneable {
/**
Column Type
------------------ ---------------------------------------------------------------
_version "uuid"
server "string"
realm {"key":{"maxLength":256,"type":"string"},"max":16,"min":0}
port "integer"
radsec "boolean"
client_cert {"key":{"maxLength":256,"minLength":1,"type":"string"},"min":0}
radius_config_name "string"
passphrase {"key":{"maxLength":128,"type":"string"},"min":0}
_uuid "uuid"
client_key {"key":{"maxLength":256,"minLength":1,"type":"string"},"min":0}
ca_cert {"key":{"maxLength":256,"minLength":1,"type":"string"},"min":0}
*/
public Uuid uuid;
public Uuid version;
public String server;
public String clientCert;
public String radiusConfigName;
public String passphrase;
public String clientKey;
public String caCert;
public Set<String> realm;
public Boolean radsec;
public Integer port;
public RadiusProxyConfigInfo() {
}
public RadiusProxyConfigInfo(Row row) {
this.uuid = row.getUuidColumn("_uuid");
this.version = row.getUuidColumn("_version");
this.server = row.getStringColumn("server");
this.clientCert = OvsdbDaoBase.getSingleValueFromSet(row, "client_cert");
this.caCert = OvsdbDaoBase.getSingleValueFromSet(row, "ca_cert");
this.clientKey = OvsdbDaoBase.getSingleValueFromSet(row, "client_key");
this.passphrase = OvsdbDaoBase.getSingleValueFromSet(row, "passphrase");
this.realm = row.getSetColumn("realm");
this.port = row.getIntegerColumn("port").intValue();
this.radsec = row.getBooleanColumn("radsec");
this.radiusConfigName = row.getStringColumn("radius_config_name");
}
@Override
public RadiusProxyConfigInfo clone() {
try {
RadiusProxyConfigInfo ret = (RadiusProxyConfigInfo)super.clone();
if (realm != null) {
ret.realm = this.realm;
}
return ret;
} catch (CloneNotSupportedException e) {
throw new IllegalStateException("Cannot clone ", e);
}
}
@Override
public int hashCode() {
return Objects.hash(caCert, clientCert, clientKey, passphrase, port, radiusConfigName, radsec, realm, server,
uuid, version);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RadiusProxyConfigInfo other = (RadiusProxyConfigInfo) obj;
return Objects.equals(caCert, other.caCert) && Objects.equals(clientCert, other.clientCert)
&& Objects.equals(clientKey, other.clientKey) && Objects.equals(passphrase, other.passphrase)
&& Objects.equals(port, other.port) && Objects.equals(radiusConfigName, other.radiusConfigName)
&& Objects.equals(radsec, other.radsec) && Objects.equals(realm, other.realm)
&& Objects.equals(server, other.server) && Objects.equals(uuid, other.uuid)
&& Objects.equals(version, other.version);
}
@Override
public String toString() {
return "RadiusProxyConfigInfo [uuid=" + uuid + ", version=" + version + ", server=" + server + ", clientCert="
+ clientCert + ", radiusConfigName=" + radiusConfigName + ", passphrase=" + passphrase + ", clientKey="
+ clientKey + ", caCert=" + caCert + ", realm=" + realm + ", radsec=" + radsec + ", port=" + port + "]";
}
}

View File

@@ -0,0 +1,100 @@
package com.telecominfraproject.wlan.opensync.ovsdb.metrics;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import com.vmware.ovsdb.callback.LockCallback;
import com.vmware.ovsdb.callback.MonitorCallback;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.methods.LockResult;
import com.vmware.ovsdb.protocol.methods.MonitorRequests;
import com.vmware.ovsdb.protocol.methods.TableUpdates;
import com.vmware.ovsdb.protocol.operation.Operation;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.schema.DatabaseSchema;
import com.vmware.ovsdb.service.OvsdbClient;
import com.vmware.ovsdb.service.OvsdbConnectionInfo;
public class OvsdbClientWithMetrics implements OvsdbClient {
private final OvsdbMetrics metrics;
private final OvsdbClient delegate;
public OvsdbClientWithMetrics(OvsdbClient delegate, OvsdbMetrics metrics) {
this.delegate = delegate;
this.metrics = metrics;
}
public CompletableFuture<String[]> listDatabases() throws OvsdbClientException {
metrics.listDatabases.increment();
return delegate.listDatabases();
}
public CompletableFuture<DatabaseSchema> getSchema(String dbName) throws OvsdbClientException {
metrics.getSchema.increment();
return delegate.getSchema(dbName);
}
public CompletableFuture<OperationResult[]> transact(String dbName, List<Operation> operations)
throws OvsdbClientException {
metrics.transact.increment();
return delegate.transact(dbName, operations);
}
public CompletableFuture<TableUpdates> monitor(String dbName, String monitorId, MonitorRequests monitorRequests,
MonitorCallback monitorCallback) throws OvsdbClientException {
metrics.monitor.increment();
return delegate.monitor(dbName, monitorId, monitorRequests, monitorCallback);
}
public CompletableFuture<Void> cancelMonitor(String monitorId) throws OvsdbClientException {
metrics.cancelMonitor.increment();
return delegate.cancelMonitor(monitorId);
}
public CompletableFuture<LockResult> lock(String lockId, LockCallback lockCallback) throws OvsdbClientException {
metrics.lock.increment();
return delegate.lock(lockId, lockCallback);
}
public CompletableFuture<LockResult> steal(String lockId, LockCallback lockCallback) throws OvsdbClientException {
metrics.steal.increment();
return delegate.steal(lockId, lockCallback);
}
public CompletableFuture<Void> unlock(String lockId) throws OvsdbClientException {
metrics.unlock.increment();
return delegate.unlock(lockId);
}
public OvsdbConnectionInfo getConnectionInfo() {
return delegate.getConnectionInfo();
}
public void shutdown() {
delegate.shutdown();
}
@Override
public int hashCode() {
return Objects.hash(delegate, metrics);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == this.delegate) {
// in this case, we are probably handling a disconnect, so we have an OvsdbClient, but not a 'metrics' client
return true;
}
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
OvsdbClientWithMetrics other = (OvsdbClientWithMetrics) obj;
return Objects.equals(delegate, other.delegate) && Objects.equals(metrics, other.metrics);
}
}

View File

@@ -0,0 +1,40 @@
package com.telecominfraproject.wlan.opensync.ovsdb.metrics;
import org.springframework.stereotype.Component;
import com.netflix.servo.DefaultMonitorRegistry;
import com.netflix.servo.monitor.BasicCounter;
import com.netflix.servo.monitor.Counter;
import com.netflix.servo.monitor.MonitorConfig;
import com.netflix.servo.tag.TagList;
import com.telecominfraproject.wlan.cloudmetrics.CloudMetricsTags;
@Component
public class OvsdbMetrics {
private final TagList tags = CloudMetricsTags.commonTags;
final Counter listDatabases = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-listDatabases").withTags(tags).build());
final Counter getSchema = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-getSchema").withTags(tags).build());
final Counter transact = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-transact").withTags(tags).build());
final Counter monitor = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-monitor").withTags(tags).build());
final Counter cancelMonitor = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-cancelMonitor").withTags(tags).build());
final Counter lock = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-lock").withTags(tags).build());
final Counter steal = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-steal").withTags(tags).build());
final Counter unlock = new BasicCounter(MonitorConfig.builder("osgw-ovsdb-unlock").withTags(tags).build());
// dtop: use anonymous constructor to ensure that the following code always
// get executed,
// even when somebody adds another constructor in here
{
DefaultMonitorRegistry.getInstance().register(listDatabases);
DefaultMonitorRegistry.getInstance().register(getSchema);
DefaultMonitorRegistry.getInstance().register(transact);
DefaultMonitorRegistry.getInstance().register(monitor);
DefaultMonitorRegistry.getInstance().register(cancelMonitor);
DefaultMonitorRegistry.getInstance().register(lock);
DefaultMonitorRegistry.getInstance().register(steal);
DefaultMonitorRegistry.getInstance().register(unlock);
}
}

View File

@@ -13,6 +13,7 @@ public class OvsdbStringConstants {
public static final String FW_IMAGE_NAME_KEY = "FW_IMAGE_NAME";
public static final String FW_IMAGE_ACTIVE_KEY = "FW_IMAGE_ACTIVE";
public static final String FW_IMAGE_INACTIVE_KEY = "FW_IMAGE_INACTIVE";
public static final String FW_IMAGE_DATE = "DATE";
// AWLAN_Node values which can be placed in firmware_url column to trigger
// behavior other than firmware download/flash

View File

@@ -30,6 +30,7 @@ import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSession;
import com.telecominfraproject.wlan.opensync.external.integration.OvsdbSessionMapInterface;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDao;
import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbMetrics;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.vmware.ovsdb.callback.MonitorCallback;
import com.vmware.ovsdb.exception.OvsdbClientException;
@@ -47,7 +48,7 @@ import io.netty.handler.ssl.SslContext;
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = OpensyncGatewayTipWlanOvsdbClientTest.class)
@Import(value = { OpensyncGatewayTipWlanOvsdbClientTest.Config.class, TipWlanOvsdbClient.class,
TipWlanOvsdbRedirector.class, OvsdbListenerConfig.class, OvsdbSessionMapInterface.class, OvsdbDao.class,
OpensyncExternalIntegrationInterface.class, OvsdbSession.class, SslContext.class })
OpensyncExternalIntegrationInterface.class, OvsdbSession.class, OvsdbMetrics.class, SslContext.class })
public class OpensyncGatewayTipWlanOvsdbClientTest {
@MockBean

View File

@@ -1,3 +1,4 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import static org.junit.Assert.assertNotNull;
@@ -33,11 +34,9 @@ import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherEmpty;
import com.telecominfraproject.wlan.core.model.equipment.RadioType;
import com.telecominfraproject.wlan.location.models.Location;
import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPHotspot20Config;
import com.telecominfraproject.wlan.profile.models.Profile;
@@ -45,11 +44,12 @@ import com.telecominfraproject.wlan.profile.models.ProfileType;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.telecominfraproject.wlan.profile.network.models.GreTunnelConfiguration;
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
import com.telecominfraproject.wlan.status.StatusServiceLocal;
import com.telecominfraproject.wlan.status.controller.StatusController;
import com.telecominfraproject.wlan.status.datastore.inmemory.StatusDatastoreInMemory;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.notation.Atom;
import com.vmware.ovsdb.protocol.operation.notation.Row;
import com.vmware.ovsdb.protocol.operation.notation.Uuid;
import com.vmware.ovsdb.protocol.operation.notation.Value;
import com.vmware.ovsdb.protocol.operation.result.ErrorResult;
import com.vmware.ovsdb.protocol.operation.result.InsertResult;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
@@ -60,16 +60,16 @@ import com.vmware.ovsdb.protocol.schema.TableSchema;
import com.vmware.ovsdb.service.OvsdbClient;
@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = { "integration_test", }) // NOTE: these profiles will
@ActiveProfiles(profiles = {"integration_test",}) // NOTE: these profiles will
// be ADDED to the list of
// active profiles
@SpringBootTest(webEnvironment = WebEnvironment.NONE, classes = OvsdbDaoTest.class)
@Import(value = { OvsdbDao.class, OvsdbDaoTest.Config.class, OvsdbNode.class, OvsdbRadioConfig.class,
OvsdbHotspotConfig.class, OvsdbCommandConfig.class, OvsdbMonitor.class, OvsdbFirmwareConfig.class,
OvsdbStatsConfig.class, OvsdbSsidConfig.class, OvsdbRrmConfig.class, OvsdbNetworkConfig.class,
OvsdbNodeConfig.class
})
@Import(
value = {OvsdbDao.class, OvsdbDaoTest.Config.class, OvsdbNode.class, OvsdbRadioConfig.class, OvsdbHotspotConfig.class, OvsdbCommandConfig.class,
OvsdbMonitor.class, OvsdbFirmwareConfig.class, OvsdbStatsConfig.class, OvsdbSsidConfig.class, OvsdbRrmConfig.class, OvsdbNetworkConfig.class,
OvsdbNodeConfig.class, OvsdbRadiusProxyConfig.class, StatusServiceLocal.class, StatusController.class,
CloudEventDispatcherEmpty.class, StatusDatastoreInMemory.class
})
public class OvsdbDaoTest {
static final int DEFAULT_CUSTOMER_ID = 1;
@@ -147,6 +147,8 @@ public class OvsdbDaoTest {
OvsdbCommandConfig ovsdbCommand;
@Autowired
OvsdbNodeConfig ovsdbNodeConfig;
@Autowired
OvsdbRadiusProxyConfig ovsdbRadiusProxyConfig;
@MockBean(answer = Answers.RETURNS_MOCKS)
OvsdbGet ovsdbGet;
@@ -176,9 +178,8 @@ public class OvsdbDaoTest {
@Test
public void testConfigureGreTunnels() throws Exception {
List<Row> rows = new ArrayList<>();
OperationResult[] operationResult = new OperationResult[] { new SelectResult(rows) };
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList()))
.thenReturn(selectionFutureResult);
OperationResult[] operationResult = new OperationResult[] {new SelectResult(rows)};
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(selectionFutureResult);
Mockito.when(selectionFutureResult.get(30, TimeUnit.SECONDS)).thenReturn(operationResult);
Profile apProfile = new Profile();
apProfile.setCustomerId(2);
@@ -215,7 +216,7 @@ public class OvsdbDaoTest {
apConfig.setEquipmentLocation(location);
ovsdbDao.getRadiusAccountingConfiguration(apConfig, ssidConfig, security);
assert (security.get("radius_acct_interval").equals("60"));
assertNull (security.get("radius_acct_interval"));
assert (security.get("radius_acct_ip").equals("192.168.0.1"));
assert (security.get("radius_acct_port").equals("1813"));
assert (security.get("radius_acct_secret").equals("secret"));
@@ -249,25 +250,21 @@ public class OvsdbDaoTest {
passpointVenueProfile.setId(VENUE_ID);
Profile hotspot20IdProviderProfile = new Profile();
hotspot20IdProviderProfile.setId(HOTSPOT_PROVIDER_ID_1);
hotspot20IdProviderProfile = OvsdbDaoTestUtilities.createPasspointIdProviderProfile(DEFAULT_CUSTOMER_ID,
hotspot20IdProviderProfile, "TipWlan-Hotspot20-OSU-Provider", "Rogers AT&T Wireless", "Canada", "ca",
302, 720, "rogers.com", 1);
hotspot20IdProviderProfile = OvsdbDaoTestUtilities.createPasspointIdProviderProfile(DEFAULT_CUSTOMER_ID, hotspot20IdProviderProfile,
"TipWlan-Hotspot20-OSU-Provider", "Rogers AT&T Wireless", "Canada", "ca", 302, 720, "rogers.com", 1);
Profile hotspot20IdProviderProfile2 = new Profile();
hotspot20IdProviderProfile2.setId(HOTSPOT_PROVIDER_ID_2);
hotspot20IdProviderProfile2 = OvsdbDaoTestUtilities.createPasspointIdProviderProfile(DEFAULT_CUSTOMER_ID,
hotspot20IdProviderProfile2, "TipWlan-Hotspot20-OSU-Provider-2", "Telus Mobility", "Canada", "ca", 302,
220, "telus.com", 1);
hotspot20IdProviderProfile2 = OvsdbDaoTestUtilities.createPasspointIdProviderProfile(DEFAULT_CUSTOMER_ID, hotspot20IdProviderProfile2,
"TipWlan-Hotspot20-OSU-Provider-2", "Telus Mobility", "Canada", "ca", 302, 220, "telus.com", 1);
profileSsidOsu.getChildProfileIds().add(hotspot20IdProviderProfile.getId());
profileSsidOsu.getChildProfileIds().add(hotspot20IdProviderProfile2.getId());
Profile passpointHotspotConfig = OvsdbDaoTestUtilities.createPasspointHotspotConfig(DEFAULT_CUSTOMER_ID,
hotspot20IdProviderProfile2, hotspot20IdProviderProfile, passpointOperatorProfile,
passpointVenueProfile, profileSsidPsk, profileSsidOsu);
Profile passpointHotspotConfig = OvsdbDaoTestUtilities.createPasspointHotspotConfig(DEFAULT_CUSTOMER_ID, hotspot20IdProviderProfile2,
hotspot20IdProviderProfile, passpointOperatorProfile, passpointVenueProfile, profileSsidPsk, profileSsidOsu);
passpointHotspotConfig.setId(HOTSPOT_CONFIG_ID);
Profile hotspotProfileAp = OvsdbDaoTestUtilities.createPasspointApProfile(DEFAULT_CUSTOMER_ID, profileSsidPsk,
profileSsidOsu);
Profile hotspotProfileAp = OvsdbDaoTestUtilities.createPasspointApProfile(DEFAULT_CUSTOMER_ID, profileSsidPsk, profileSsidOsu);
hotspotProfileAp.setId(EQUIPMENT_AP_ID);
hsConfig.setHotspot20OperatorSet(Set.of(passpointOperatorProfile));
@@ -281,14 +278,12 @@ public class OvsdbDaoTest {
apConfig.setSsidProfile(List.of(profileSsidOsu, profileSsidPsk));
Mockito.when(futureResult.get(Mockito.anyLong(), Mockito.eq(TimeUnit.SECONDS)))
.thenReturn(OvsdbDaoTestUtilities.hs20IconRows()).thenReturn(OvsdbDaoTestUtilities.hs20InsertIconRows())
.thenReturn(OvsdbDaoTestUtilities.hs20OsuProviders()).thenReturn(OvsdbDaoTestUtilities.hs20IconRows())
.thenReturn(OvsdbDaoTestUtilities.hs20IconRows())
.thenReturn(OvsdbDaoTestUtilities.hs20InsertProviderRows())
.thenReturn(OvsdbDaoTestUtilities.hs20Config()).thenReturn(OvsdbDaoTestUtilities.hs20OsuProviders())
.thenReturn(OvsdbDaoTestUtilities.vifConfigRows()).thenReturn(OvsdbDaoTestUtilities.vifConfigRows())
.thenReturn(OvsdbDaoTestUtilities.hs20Config());
Mockito.when(futureResult.get(Mockito.anyLong(), Mockito.eq(TimeUnit.SECONDS))).thenReturn(OvsdbDaoTestUtilities.hs20IconRows())
.thenReturn(OvsdbDaoTestUtilities.hs20InsertIconRows()).thenReturn(OvsdbDaoTestUtilities.hs20OsuProviders())
.thenReturn(OvsdbDaoTestUtilities.hs20IconRows()).thenReturn(OvsdbDaoTestUtilities.hs20IconRows())
.thenReturn(OvsdbDaoTestUtilities.hs20InsertProviderRows()).thenReturn(OvsdbDaoTestUtilities.hs20Config())
.thenReturn(OvsdbDaoTestUtilities.hs20OsuProviders()).thenReturn(OvsdbDaoTestUtilities.vifConfigRows())
.thenReturn(OvsdbDaoTestUtilities.vifConfigRows()).thenReturn(OvsdbDaoTestUtilities.hs20Config());
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);
@@ -350,275 +345,12 @@ public class OvsdbDaoTest {
}
@Test
public void testGetConnectNodeInfo() throws Exception {
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);
java.util.Map<String, Value> awlanColumns = new HashMap<>();
awlanColumns.put("mqtt_settings", com.vmware.ovsdb.protocol.operation.notation.Map
.of(ImmutableMap.of("broker", "192.168.1.101", "port", "1883")));
awlanColumns.put("redirector_addr", Atom.string(REDIRECT_ADDR));
awlanColumns.put("manager_addr", Atom.string(MGR_ADDR));
awlanColumns.put("platform_version", Atom.string(PLATFORM_VERSION));
awlanColumns.put("firmware_version", Atom.string(FW_VERSION));
awlanColumns.put("revision", Atom.string(REVISION));
awlanColumns.put("sku_number", Atom.string(SKU_NUMBER));
awlanColumns.put("serial_number", Atom.string(SERIAL_NUM));
awlanColumns.put("model", Atom.string(MODEL));
Row awlanRow = new Row(awlanColumns);
List<Row> awlanRows = ImmutableList.of(awlanRow);
OperationResult[] awlanResult = new OperationResult[] { new SelectResult(awlanRows) };
java.util.Map<String, Value> inetWanColumns = new HashMap<>();
inetWanColumns.put("inet_addr", Atom.string(WAN_IP));
inetWanColumns.put("hwaddr", Atom.string(WAN_MAC));
inetWanColumns.put("if_name", Atom.string(WAN_IF_NAME));
inetWanColumns.put("if_type", Atom.string(WAN_IF_TYPE));
Row inetWanRow = new Row(inetWanColumns);
List<Row> inetWanRows = ImmutableList.of(inetWanRow);
OperationResult[] inetWanResult = new OperationResult[] { new SelectResult(inetWanRows) };
java.util.Map<String, Value> inetLanColumns = new HashMap<>();
inetLanColumns.put("inet_addr", Atom.string(LAN_IP));
inetLanColumns.put("hwaddr", Atom.string(LAN_MAC));
inetLanColumns.put("if_name", Atom.string(LAN_IF_NAME));
inetLanColumns.put("if_type", Atom.string(LAN_IF_TYPE));
Row inetLanRow = new Row(inetLanColumns);
List<Row> inetLanRows = ImmutableList.of(inetLanRow);
OperationResult[] inetLanResult = new OperationResult[] { new SelectResult(inetLanRows) };
java.util.Map<String, Value> wifiRadioStateColumns = new HashMap<>();
wifiRadioStateColumns.put("freq_band", Atom.string("2.4G"));
wifiRadioStateColumns.put("if_name", Atom.string("home-ap-24"));
Row wifiRadioStateRow = new Row(wifiRadioStateColumns);
java.util.Map<String, Value> wifiRadioStateColumns2 = new HashMap<>();
wifiRadioStateColumns2.put("freq_band", Atom.string("5GL"));
wifiRadioStateColumns2.put("if_name", Atom.string("home-ap-l50"));
Row wifiRadioStateRow2 = new Row(wifiRadioStateColumns2);
java.util.Map<String, Value> wifiRadioStateColumns3 = new HashMap<>();
wifiRadioStateColumns3.put("freq_band", Atom.string("5GU"));
wifiRadioStateColumns3.put("if_name", Atom.string("home-ap-u50"));
Row wifiRadioStateRow3 = new Row(wifiRadioStateColumns3);
List<Row> wifiRadioStateRows = ImmutableList.of(wifiRadioStateRow, wifiRadioStateRow2, wifiRadioStateRow3);
OperationResult[] wifiRadioStateResult = new OperationResult[] { new SelectResult(wifiRadioStateRows) };
Mockito.when(futureResult.get(Mockito.anyLong(), Mockito.eq(TimeUnit.SECONDS))).thenReturn(awlanResult)
.thenReturn(inetWanResult).thenReturn(inetLanResult).thenReturn(wifiRadioStateResult);
ConnectNodeInfo connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient);
assertNotNull(connectNodeInfo);
assert (connectNodeInfo.wifiRadioStates.entrySet().size() == 3);
assert (connectNodeInfo.firmwareVersion.equals(FW_VERSION));
assert (connectNodeInfo.redirectorAddr.equals(REDIRECT_ADDR));
assert (connectNodeInfo.ipV4Address.equals(WAN_IP));
assert (connectNodeInfo.lanIfName.equals(LAN_IF_NAME));
assert (connectNodeInfo.ifName.equals(WAN_IF_NAME));
Mockito.verify(ovsdbClient, Mockito.times(4)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
}
@Test(expected = RuntimeException.class)
public void testFailGetConnectNodeInfo() throws Exception {
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);
java.util.Map<String, Value> awlanColumns = new HashMap<>();
awlanColumns.put("mqtt_settings", com.vmware.ovsdb.protocol.operation.notation.Map
.of(ImmutableMap.of("broker", "192.168.1.101", "port", "1883")));
awlanColumns.put("redirector_addr", Atom.string(REDIRECT_ADDR));
awlanColumns.put("manager_addr", Atom.string(MGR_ADDR));
awlanColumns.put("platform_version", Atom.string(PLATFORM_VERSION));
awlanColumns.put("firmware_version", Atom.string(FW_VERSION));
awlanColumns.put("revision", Atom.string(REVISION));
awlanColumns.put("sku_number", Atom.string(SKU_NUMBER));
awlanColumns.put("serial_number", Atom.string(SERIAL_NUM));
awlanColumns.put("model", Atom.string(MODEL));
Row awlanRow = new Row(awlanColumns);
List<Row> awlanRows = ImmutableList.of(awlanRow);
OperationResult[] awlanResult = new OperationResult[] { new SelectResult(awlanRows) };
java.util.Map<String, Value> inetWanColumns = new HashMap<>();
inetWanColumns.put("inet_addr", Atom.string(WAN_IP));
inetWanColumns.put("hwaddr", Atom.string(WAN_MAC));
inetWanColumns.put("if_name", Atom.string(WAN_IF_NAME));
inetWanColumns.put("if_type", Atom.string(WAN_IF_TYPE));
Row inetWanRow = new Row(inetWanColumns);
List<Row> inetWanRows = ImmutableList.of(inetWanRow);
OperationResult[] inetWanResult = new OperationResult[] { new SelectResult(inetWanRows) };
OperationResult[] errorResult = new OperationResult[] { new ErrorResult("Error", "Error") };
java.util.Map<String, Value> inetLanColumns = new HashMap<>();
inetLanColumns.put("inet_addr", Atom.string(LAN_IP));
inetLanColumns.put("hwaddr", Atom.string(LAN_MAC));
inetLanColumns.put("if_name", Atom.string(LAN_IF_NAME));
inetLanColumns.put("if_type", Atom.string(LAN_IF_TYPE));
Row inetLanRow = new Row(inetLanColumns);
List<Row> inetLanRows = ImmutableList.of(inetLanRow);
OperationResult[] inetLanResult = new OperationResult[] { new SelectResult(inetLanRows) };
java.util.Map<String, Value> wifiRadioStateColumns = new HashMap<>();
wifiRadioStateColumns.put("freq_band", Atom.string("2.4G"));
wifiRadioStateColumns.put("if_name", Atom.string("home-ap-24"));
Row wifiRadioStateRow = new Row(wifiRadioStateColumns);
java.util.Map<String, Value> wifiRadioStateColumns2 = new HashMap<>();
wifiRadioStateColumns2.put("freq_band", Atom.string("5GL"));
wifiRadioStateColumns2.put("if_name", Atom.string("home-ap-l50"));
Row wifiRadioStateRow2 = new Row(wifiRadioStateColumns2);
java.util.Map<String, Value> wifiRadioStateColumns3 = new HashMap<>();
wifiRadioStateColumns3.put("freq_band", Atom.string("5GU"));
wifiRadioStateColumns3.put("if_name", Atom.string("home-ap-u50"));
Row wifiRadioStateRow3 = new Row(wifiRadioStateColumns3);
List<Row> wifiRadioStateRows = ImmutableList.of(wifiRadioStateRow, wifiRadioStateRow2, wifiRadioStateRow3);
OperationResult[] wifiRadioStateResult = new OperationResult[] { new SelectResult(wifiRadioStateRows) };
// No 'WAN' for this test, will have an ERROR
Mockito.when(futureResult.get(Mockito.anyLong(), Mockito.eq(TimeUnit.SECONDS))).thenReturn(awlanResult)
.thenReturn(errorResult).thenReturn(errorResult).thenReturn(inetLanResult)
.thenReturn(wifiRadioStateResult);
ConnectNodeInfo connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient);
assertNotNull(connectNodeInfo.firmwareVersion);
assertNotNull(connectNodeInfo.model);
assertNotNull(connectNodeInfo.skuNumber);
assertNotNull(connectNodeInfo.platformVersion);
assertNotNull(connectNodeInfo.serialNumber);
assertNotNull(connectNodeInfo.mqttSettings);
assertNotNull(connectNodeInfo.redirectorAddr);
assertNotNull(connectNodeInfo.managerAddr);
assertNull(connectNodeInfo.ifName);
assertNull(connectNodeInfo.ifType);
assertNull(connectNodeInfo.ipV4Address);
assertNull(connectNodeInfo.macAddress);
assertNotNull(connectNodeInfo.lanIfName);
assertNotNull(connectNodeInfo.lanIfType);
assertNotNull(connectNodeInfo.lanIpV4Address);
assertNotNull(connectNodeInfo.lanMacAddress);
assert (connectNodeInfo.wifiRadioStates.entrySet().size() == 3);
Mockito.verify(ovsdbClient, Mockito.times(5)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
Mockito.clearInvocations(ovsdbClient);
// No 'LAN' for this test, will have an ERROR
Mockito.when(futureResult.get(Mockito.anyLong(), Mockito.eq(TimeUnit.SECONDS))).thenReturn(awlanResult)
.thenReturn(inetWanResult).thenReturn(errorResult).thenReturn(wifiRadioStateResult);
connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient);
assertNotNull(connectNodeInfo.firmwareVersion);
assertNotNull(connectNodeInfo.model);
assertNotNull(connectNodeInfo.skuNumber);
assertNotNull(connectNodeInfo.platformVersion);
assertNotNull(connectNodeInfo.serialNumber);
assertNotNull(connectNodeInfo.mqttSettings);
assertNotNull(connectNodeInfo.redirectorAddr);
assertNotNull(connectNodeInfo.managerAddr);
assertNotNull(connectNodeInfo.ifName);
assertNotNull(connectNodeInfo.ifType);
assertNotNull(connectNodeInfo.ipV4Address);
assertNotNull(connectNodeInfo.macAddress);
assertNull(connectNodeInfo.lanIfName);
assertNull(connectNodeInfo.lanIfType);
assertNull(connectNodeInfo.lanIpV4Address);
assertNull(connectNodeInfo.lanMacAddress);
assert (connectNodeInfo.wifiRadioStates.entrySet().size() == 3);
Mockito.verify(ovsdbClient, Mockito.times(4)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
Mockito.clearInvocations(ovsdbClient);
// No 'Wifi_Radio_State data' for this test, will have an ERROR
Mockito.when(futureResult.get(Mockito.anyLong(), Mockito.eq(TimeUnit.SECONDS))).thenReturn(awlanResult)
.thenReturn(inetWanResult).thenReturn(inetLanResult).thenReturn(errorResult);
connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient);
assertNotNull(connectNodeInfo.firmwareVersion);
assertNotNull(connectNodeInfo.model);
assertNotNull(connectNodeInfo.skuNumber);
assertNotNull(connectNodeInfo.platformVersion);
assertNotNull(connectNodeInfo.serialNumber);
assertNotNull(connectNodeInfo.mqttSettings);
assertNotNull(connectNodeInfo.redirectorAddr);
assertNotNull(connectNodeInfo.managerAddr);
assertNotNull(connectNodeInfo.ifName);
assertNotNull(connectNodeInfo.ifType);
assertNotNull(connectNodeInfo.ipV4Address);
assertNotNull(connectNodeInfo.macAddress);
assertNotNull(connectNodeInfo.lanIfName);
assertNotNull(connectNodeInfo.lanIfType);
assertNotNull(connectNodeInfo.lanIpV4Address);
assertNotNull(connectNodeInfo.lanMacAddress);
assert (connectNodeInfo.wifiRadioStates.isEmpty());
Mockito.verify(ovsdbClient, Mockito.times(4)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
Mockito.clearInvocations(ovsdbClient);
// No 'AWLAN_Node data' for this test, will have an ERROR
Mockito.when(futureResult.get(Mockito.anyLong(), Mockito.eq(TimeUnit.SECONDS))).thenReturn(errorResult)
.thenReturn(inetWanResult).thenReturn(inetLanResult).thenReturn(wifiRadioStateResult);
connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient);
assertNull(connectNodeInfo.firmwareVersion);
assertNull(connectNodeInfo.model);
assertNull(connectNodeInfo.skuNumber);
assertNull(connectNodeInfo.platformVersion);
assertNull(connectNodeInfo.serialNumber);
assertNull(connectNodeInfo.mqttSettings);
assertNull(connectNodeInfo.redirectorAddr);
assertNull(connectNodeInfo.managerAddr);
assertNotNull(connectNodeInfo.ifName);
assertNotNull(connectNodeInfo.ifType);
assertNotNull(connectNodeInfo.ipV4Address);
assertNotNull(connectNodeInfo.macAddress);
assertNotNull(connectNodeInfo.lanIfName);
assertNotNull(connectNodeInfo.lanIfType);
assertNotNull(connectNodeInfo.lanIpV4Address);
assertNotNull(connectNodeInfo.lanMacAddress);
assert (connectNodeInfo.wifiRadioStates.entrySet().size() == 3);
Mockito.verify(ovsdbClient, Mockito.times(4)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
Mockito.clearInvocations(ovsdbClient);
}
@Test
public void testObsdbDaoEnableNetworkProbe() throws Exception {
Uuid rowUuid = Uuid.of(UUID.randomUUID());
OperationResult[] wifiStatsConfigEnableNetworkProbe = new OperationResult[] { new InsertResult(rowUuid) };
OperationResult[] wifiStatsConfigEnableNetworkProbe = new OperationResult[] {new InsertResult(rowUuid)};
Mockito.when(futureResult.get(30L, TimeUnit.SECONDS)).thenReturn(wifiStatsConfigEnableNetworkProbe);
@@ -633,9 +365,8 @@ public class OvsdbDaoTest {
@Test
public void testObsdbDaoEnableNetworkProbeError() throws Exception {
OperationResult[] wifiStatsConfigEnableNetworkProbeFail = new OperationResult[] { new ErrorResult(
"constraint violation",
"network_probe is not one of the allowed values ([capacity, client, device, essid, neighbor, quality, radio, rssi, steering, survey])") };
OperationResult[] wifiStatsConfigEnableNetworkProbeFail = new OperationResult[] {new ErrorResult("constraint violation",
"network_probe is not one of the allowed values ([capacity, client, device, essid, neighbor, quality, radio, rssi, steering, survey])")};
Mockito.when(futureResult.get(30L, TimeUnit.SECONDS)).thenReturn(wifiStatsConfigEnableNetworkProbeFail);
@@ -650,19 +381,16 @@ public class OvsdbDaoTest {
@Test
public void testProcessNewChannelsRequest() throws Exception {
OperationResult[] testProcessNewChannelsRequestResult = new OperationResult[] { new UpdateResult(1),
new UpdateResult(1), new UpdateResult(1), new UpdateResult(1), new UpdateResult(1),
new UpdateResult(1) };
OperationResult[] testProcessNewChannelsRequestResult = new OperationResult[] {new UpdateResult(1), new UpdateResult(1), new UpdateResult(1),
new UpdateResult(1), new UpdateResult(1), new UpdateResult(1)};
Mockito.when(futureResult.get(30L, TimeUnit.SECONDS)).thenReturn(testProcessNewChannelsRequestResult);
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);
ovsdbDao.processNewChannelsRequest(ovsdbClient,
Map.of(RadioType.is2dot4GHz, Integer.valueOf(1), RadioType.is5GHzL, Integer.valueOf(40),
RadioType.is5GHzU, Integer.valueOf(153)),
Map.of(RadioType.is2dot4GHz, Integer.valueOf(6), RadioType.is5GHzL, Integer.valueOf(36),
RadioType.is5GHzU, Integer.valueOf(149)));
Map.of(RadioType.is2dot4GHz, Integer.valueOf(1), RadioType.is5GHzL, Integer.valueOf(40), RadioType.is5GHzU, Integer.valueOf(153)),
Map.of(RadioType.is2dot4GHz, Integer.valueOf(6), RadioType.is5GHzL, Integer.valueOf(36), RadioType.is5GHzU, Integer.valueOf(149)));
Mockito.verify(futureResult).get(30L, TimeUnit.SECONDS);
@@ -671,8 +399,7 @@ public class OvsdbDaoTest {
@Test(expected = RuntimeException.class)
public void testObsdbDaoEnableNetworkProbeException() throws Exception {
Mockito.when(futureResult.get(30L, TimeUnit.SECONDS))
.thenThrow(new OvsdbClientException("OvsdbClientException"));
Mockito.when(futureResult.get(30L, TimeUnit.SECONDS)).thenThrow(new OvsdbClientException("OvsdbClientException"));
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);

View File

@@ -0,0 +1,245 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import com.telecominfraproject.wlan.equipment.models.Equipment;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.profile.ethernetport.models.WiredEthernetPortConfiguration;
import com.telecominfraproject.wlan.profile.ethernetport.models.WiredPort;
import com.telecominfraproject.wlan.profile.models.Profile;
import com.telecominfraproject.wlan.profile.models.ProfileType;
import com.telecominfraproject.wlan.status.StatusServiceInterface;
import com.telecominfraproject.wlan.status.equipment.report.models.WiredEthernetPortStatusData;
import com.telecominfraproject.wlan.status.equipment.report.models.WiredPortStatus;
import com.telecominfraproject.wlan.status.models.Status;
import com.telecominfraproject.wlan.status.models.StatusDataType;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
import com.vmware.ovsdb.service.OvsdbClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import static org.mockito.Mockito.times;
/**
* @author rsharma
*/
@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = { "integration_test", })
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = OvsdbNetworkConfigTest.class)
@Import(value = { OvsdbNetworkConfig.class
})
public class OvsdbNetworkConfigTest {
@Mock(answer = Answers.RETURNS_MOCKS)
OvsdbClient ovsdbClient;
@Autowired
OvsdbNetworkConfig ovsdbNetworkConfig;
@MockBean(answer = Answers.RETURNS_MOCKS)
StatusServiceInterface statusServiceInterface;
@MockBean(answer = Answers.RETURNS_MOCKS)
OvsdbGet ovsdbGet;
@Mock(answer = Answers.RETURNS_MOCKS)
CompletableFuture<OperationResult[]> futureResult;
private MockitoSession mockito;
private static final String LAN_IF_NAME = "lan";
@Before
public void setUp() throws Exception {
mockito = Mockito.mockitoSession().initMocks(this).strictness(Strictness.WARN).startMocking();
Mockito.when(ovsdbClient.transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList())).thenReturn(futureResult);
}
@After
public void tearDown() throws Exception {
mockito.finishMocking();
}
// Eth0 port is in LAN mode and we need it to convert to eth0_trunk
@Test
public void testConfigureEthernetPorts_BridgeTrunkMode() throws ExecutionException, InterruptedException, TimeoutException, OvsdbClientException {
OperationResult[] updateResult = new OperationResult[] { new UpdateResult(1) };
Mockito.when(futureResult.get(ovsdbNetworkConfig.ovsdbTimeoutSec, TimeUnit.SECONDS))
.thenReturn(updateResult);
ovsdbNetworkConfig.configureEthernetPorts(ovsdbClient, createOpensyncApConfig(true, "bridge"));
Mockito.verify(ovsdbClient, times(2)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
}
// Other tests that are useful to consider -- NOT anymore with GW deleting existing interfaces
// Case when ETH port is in eth0_trunk mode and no changes are required
// Case when ETH port is already in eth0_vlan100 and no changes are required
// Case when ETH port is in LAN mode and we convert it into BRIDGE + VlanId
@Test
public void testConfigureEthernetPorts_BridgeAccessMode() throws ExecutionException, InterruptedException, TimeoutException, OvsdbClientException {
OperationResult[] updateResult = new OperationResult[] { new UpdateResult(1) };
Mockito.when(futureResult.get(ovsdbNetworkConfig.ovsdbTimeoutSec, TimeUnit.SECONDS))
.thenReturn(updateResult);
ovsdbNetworkConfig.configureEthernetPorts(ovsdbClient, createOpensyncApConfig(false, "bridge"));
Mockito.verify(ovsdbClient, times(2)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
}
// Case when ETH port is in BRIDGE + VlanId and we convert it into NAT (LAN)
@Test
public void testConfigureEthernetPorts_BridgeAccessToNATConversion() throws ExecutionException, InterruptedException, TimeoutException, OvsdbClientException {
OperationResult[] updateResult = new OperationResult[] { new UpdateResult(1) };
Mockito.when(futureResult.get(ovsdbNetworkConfig.ovsdbTimeoutSec, TimeUnit.SECONDS))
.thenReturn(updateResult);
ovsdbNetworkConfig.configureEthernetPorts(ovsdbClient, createOpensyncApConfig(false, "NAT"));
Mockito.verify(ovsdbClient, times(1)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
}
// Case when ETH port is in BRIDGE + Trunk and Profile is removed so we convert
// it in NAT (LAN)
@Test
public void testResetWiredPorts_BridgeTrunkToNAT()
throws ExecutionException, InterruptedException, TimeoutException, OvsdbClientException {
// at the beginning LAN's currentIfName is wan
Mockito.when(statusServiceInterface.getOrNull(Mockito.anyInt(), Mockito.anyLong(),
Mockito.any(StatusDataType.class))).thenReturn(createWiredEthernetPortStatus("wan"));
OperationResult[] updateResult = new OperationResult[] { new UpdateResult(1) };
Mockito.when(futureResult.get(ovsdbNetworkConfig.ovsdbTimeoutSec, TimeUnit.SECONDS)).thenReturn(updateResult);
ovsdbNetworkConfig.resetWiredPorts(ovsdbClient, createOpensyncApConfig(true, "bridge"));
// transact() execute 1 time as we move LAN from wan interface back to lan
// interface
// (vlan interface will be removed in inetC table directly)
Mockito.verify(ovsdbClient, times(1)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
}
// Case when ETH port is in NAT + Access and Profile is removed we don't do
// anything
@Test
public void testResetWiredPorts_NATToNAT()
throws ExecutionException, InterruptedException, TimeoutException, OvsdbClientException {
// at the beginning LAN's currentIfName is wan
Mockito.when(statusServiceInterface.getOrNull(Mockito.anyInt(), Mockito.anyLong(),
Mockito.any(StatusDataType.class))).thenReturn(createWiredEthernetPortStatus("lan"));
OperationResult[] updateResult = new OperationResult[] { new UpdateResult(1) };
Mockito.when(futureResult.get(ovsdbNetworkConfig.ovsdbTimeoutSec, TimeUnit.SECONDS)).thenReturn(updateResult);
ovsdbNetworkConfig.resetWiredPorts(ovsdbClient, createOpensyncApConfig(false, "NAT"));
// Note: Strictness set to WARN in setup() rather than STRICT_STUB as we are
// adding unnecessary stubbings above to test if any transact() is called.
Mockito.verify(ovsdbClient, times(0)).transact(Mockito.eq(OvsdbDao.ovsdbName), Mockito.anyList());
}
private OpensyncAPConfig createOpensyncApConfig(boolean isTrunkEnabled, String ifType) {
OpensyncAPConfig opensyncApConfig = new OpensyncAPConfig();
Equipment customerEquip = new Equipment();
customerEquip.setCustomerId(1);
customerEquip.setId(1L);
opensyncApConfig.setCustomerEquipment(customerEquip);
opensyncApConfig.setWiredEthernetPortProfile(createWiredEthernetPortProfile(isTrunkEnabled, ifType));
return opensyncApConfig;
}
private Profile createWiredEthernetPortProfile(boolean isTrunkEnabled, String ifType) {
WiredPort portLan = createWiredPort("lan", ifType, isTrunkEnabled, 10, List.of(100, 200), "eth0", "ETHERNET");
WiredPort portWan = createWiredPort("wan", "bridge", false, 0, null, "eth1", "INTERNET");
WiredEthernetPortConfiguration details = new WiredEthernetPortConfiguration();
details.setEquipmentModel("EA8300");
details.setEthPorts(Set.of(portLan, portWan));
Profile wiredEthernetPortProfile = new Profile();
wiredEthernetPortProfile.setCustomerId(1);
wiredEthernetPortProfile.setProfileType(ProfileType.wired_ethernet_port);
wiredEthernetPortProfile.setId(10L);
wiredEthernetPortProfile.setName("WiredProfileForTest");
wiredEthernetPortProfile.setCreatedTimestamp(1634060798000L);
wiredEthernetPortProfile.setLastModifiedTimestamp(1634060798000L);
wiredEthernetPortProfile.setDetails(details);
return wiredEthernetPortProfile;
}
private WiredPort createWiredPort(String ifName, String ifType, boolean isTrunkEnabled, int vlanId, List<Integer> allowedVlans,
String name, String displayName) {
WiredPort wiredPort = new WiredPort();
wiredPort.setIfName(ifName);
wiredPort.setIfType(ifType);
wiredPort.setTrunkEnabled(isTrunkEnabled);
wiredPort.setVlanId(vlanId);
wiredPort.setAllowedVlanIds(allowedVlans);
wiredPort.setName(name);
wiredPort.setDisplayName(displayName);
return wiredPort;
}
private Status createWiredEthernetPortStatus(String lanPortIfName) {
WiredEthernetPortStatusData statusDetails = new WiredEthernetPortStatusData();
if (lanPortIfName.equals(LAN_IF_NAME)) {
WiredPortStatus wiredPortStatusLan = createWiredPortStatus(lanPortIfName, "NAT", false, 0, null, "eth0", "lan", "up");
WiredPortStatus wiredPortStatusWan = createWiredPortStatus("wan", "bridge", true, 0, null, "eth1", "wan", "up");
statusDetails.setInterfacePortStatusMap(Map.of("lan", List.of(wiredPortStatusLan), "wan", List.of(wiredPortStatusWan)));
} else {
WiredPortStatus wiredPortStatusLan = createWiredPortStatus(lanPortIfName, "bridge", true, 10, List.of(100,200), "eth0", "lan", "up");
WiredPortStatus wiredPortStatusWan = createWiredPortStatus("wan", "bridge", true, 0, null, "eth1", "wan", "up");
statusDetails.setInterfacePortStatusMap(Map.of("lan", List.of(), "wan", List.of(wiredPortStatusLan, wiredPortStatusWan)));
}
Status status = new Status();
status.setCustomerId(1);
status.setEquipmentId(1L);
status.setStatusDataType(StatusDataType.WIRED_ETHERNET_PORT);
status.setDetails(statusDetails);
return status;
}
private WiredPortStatus createWiredPortStatus(String ifName, String ifType, boolean isTrunkEnabled, int vlanId,
List<Integer> allowedVlans, String name, String originalIfName, String operationalState) {
WiredPortStatus status = new WiredPortStatus();
status.setIfType(ifType);
status.setCurrentIfName(ifName);
status.setOriginalIfName(originalIfName);
status.setName(name);
status.setAllowedVlanIds(allowedVlans);
status.setDuplex("full");
status.setSpeed(1000);
status.setTrunkEnabled(isTrunkEnabled);
status.setOperationalState(operationalState);
status.setVlanId(vlanId);
return status;
}
}

View File

@@ -23,8 +23,12 @@ import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherEmpty;
import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo;
import com.telecominfraproject.wlan.opensync.util.OvsdbToWlanCloudTypeMappingUtility;
import com.telecominfraproject.wlan.status.StatusServiceLocal;
import com.telecominfraproject.wlan.status.controller.StatusController;
import com.telecominfraproject.wlan.status.datastore.inmemory.StatusDatastoreInMemory;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.service.OvsdbClient;
@@ -36,8 +40,8 @@ import com.vmware.ovsdb.service.OvsdbClient;
@Import(value = { OvsdbDao.class, OvsdbNodeTest.Config.class, OvsdbNode.class, OvsdbRadioConfig.class,
OvsdbHotspotConfig.class, OvsdbCommandConfig.class, OvsdbMonitor.class, OvsdbFirmwareConfig.class,
OvsdbStatsConfig.class, OvsdbSsidConfig.class, OvsdbRrmConfig.class, OvsdbNetworkConfig.class,
OvsdbNodeConfig.class
OvsdbNodeConfig.class,OvsdbRadiusProxyConfig.class, StatusServiceLocal.class, StatusController.class,
CloudEventDispatcherEmpty.class, StatusDatastoreInMemory.class
})
public class OvsdbNodeTest {
@@ -77,6 +81,8 @@ public class OvsdbNodeTest {
OvsdbCommandConfig ovsdbCommand;
@Autowired
OvsdbNodeConfig ovsdbNodeConfig;
@Autowired
OvsdbRadiusProxyConfig ovsdbRadiusProxyConfig;
@MockBean(answer = Answers.RETURNS_MOCKS)
OvsdbGet ovsdbGet;
@@ -110,6 +116,7 @@ public class OvsdbNodeTest {
connectNodeInfo.lanIfName = "lan";
connectNodeInfo.lanIfType = "bridge";
connectNodeInfo.serialNumber = "0123456789";
connectNodeInfo.model = "EA8300-CA";
Map<String, String> newMqttSettings = new HashMap<>();
newMqttSettings.put("broker", ovsdbNode.mqttBrokerAddress);
@@ -124,7 +131,7 @@ public class OvsdbNodeTest {
ConnectNodeInfo newConnectNodeInfo = ovsdbNode.updateConnectNodeInfoOnConnect(ovsdbClient, "AP-1",
connectNodeInfo, false);
assert (connectNodeInfo.ifName.equals(newConnectNodeInfo.ifName));
assert (newConnectNodeInfo.skuNumber.equals("tip.wlan_" + connectNodeInfo.serialNumber));
assert (newConnectNodeInfo.skuNumber.equals("TIP-" + connectNodeInfo.model));
assert (newConnectNodeInfo.mqttSettings.equals(newMqttSettings));
}

View File

@@ -24,12 +24,16 @@ import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import com.telecominfraproject.wlan.cloudeventdispatcher.CloudEventDispatcherEmpty;
import com.telecominfraproject.wlan.location.models.Location;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.profile.models.Profile;
import com.telecominfraproject.wlan.profile.models.ProfileType;
import com.telecominfraproject.wlan.profile.radius.models.RadiusProfile;
import com.telecominfraproject.wlan.profile.ssid.models.SsidConfiguration;
import com.telecominfraproject.wlan.status.StatusServiceLocal;
import com.telecominfraproject.wlan.status.controller.StatusController;
import com.telecominfraproject.wlan.status.datastore.inmemory.StatusDatastoreInMemory;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.service.OvsdbClient;
@@ -41,8 +45,8 @@ import com.vmware.ovsdb.service.OvsdbClient;
@Import(value = { OvsdbDao.class, OvsdbSsidConfigTest.Config.class, OvsdbNode.class, OvsdbRadioConfig.class,
OvsdbHotspotConfig.class, OvsdbCommandConfig.class, OvsdbMonitor.class, OvsdbFirmwareConfig.class,
OvsdbStatsConfig.class, OvsdbSsidConfig.class, OvsdbRrmConfig.class, OvsdbNetworkConfig.class,
OvsdbNodeConfig.class
OvsdbNodeConfig.class, OvsdbRadiusProxyConfig.class, StatusServiceLocal.class, StatusController.class,
CloudEventDispatcherEmpty.class, StatusDatastoreInMemory.class
})
public class OvsdbSsidConfigTest {
@@ -82,7 +86,8 @@ public class OvsdbSsidConfigTest {
OvsdbCommandConfig ovsdbCommand;
@Autowired
OvsdbNodeConfig ovsdbNodeConfig;
@Autowired
OvsdbRadiusProxyConfig ovsdbRadiusProxyConfig;
@MockBean(answer = Answers.RETURNS_MOCKS)
OvsdbGet ovsdbGet;