Compare commits

...

117 Commits

Author SHA1 Message Date
ralphlee
38781e59f4 [WIFI-7889] Additional handling on clientIp and clientDisconnect events 2022-05-11 16:07:55 -04:00
ralphlee3
4e8164fb6d [WIFI-7888] Add concurrent burst config handling in opensync gateway (#84) 2022-05-11 15:48:16 -04:00
ralphlee3
4b6a18df9f [WIFI-7823] Adding ctxRoutingId handling in connect/disconnect paths to determine true disconnect (#83) 2022-05-02 14:33:51 -04:00
Dmitry Toptygin
8724c4521c WIFI-7817 - fixed osgw to use unique clientId when registering with MQTT broker, also to tell APs to post messages into gateway-specific MQTT topic (#82) 2022-04-28 13:54:11 -04:00
norm-traxler
583d8e1e4c Merge pull request #81 from Telecominfraproject/WIFI-7708-add-bssid
[WIFI-7708] Add BSSID handling for client session
2022-04-21 09:44:04 -04:00
ralphlee
19473c8b39 [WIFI-7708] Add BSSID handling for client session 2022-04-21 00:42:22 -04:00
christieunitt-cu
307bf0cd1c Merge pull request #80 from Telecominfraproject/NE-4690/portMismatch
NETEXP-4690 Port to 1.4: OpenSync gateway change to derive radioType …
2022-04-12 16:04:41 -04:00
Christie Unitt
de7d156429 NETEXP-4690 Port to 1.4: OpenSync gateway change to dervie radioType from AP chan number 2022-04-12 15:56:47 -04:00
ralphlee3
4512096a49 [WIFI-7588] Disconnect client sessions on DHCP lease IP table delete (#79) 2022-04-11 16:27:25 -04:00
ralphlee3
1275043232 [WIFI-7579] Bugfixes on updating status API for auto-upgrade (#78) 2022-04-11 11:48:22 -04:00
ralphlee3
78f4169339 [WIFI-7514] Adding init for DHCP lease ip table when ap connects (#77)
* [WIFI-7514] Adding init for DHCP lease ip table when ap connects

* [WIFI-7514] Fix enum handling for DHCP Lease IP table
2022-03-31 13:04:40 -04:00
lynnshi-design
b7c6594937 WIFI-7336 OpenSync: assocClientRx should be busySelf (not busyRx) (#76)
Co-authored-by: Lynn Shi <lynn.shi@netexperience.com>
2022-03-21 13:18:49 -04:00
norm-traxler
d2c7eac05d Merge pull request #75 from Telecominfraproject/WIFI-7323
[WIFI-7323] push new config to AP only if the cloud config is more re…
2022-03-18 17:16:08 -04:00
ralphlee
69f9f1a973 [WIFI-7323] push new config to AP only if the cloud config is more recent than what was previouly pushed 2022-03-18 17:12:21 -04:00
ralphlee
c6582199e9 Remove some unused APC logic 2022-01-14 10:52:15 -05:00
ralphlee
d167278a6b [WIFI-6721] Add support for manual radproxy, radproxy secret 2022-01-14 10:52:15 -05:00
christieunitt-cu
6a90a24c52 Merge pull request #73 from Telecominfraproject/WIFI-6002/busyRx
WIFI-6002 RadioUtilization.assocClientRx should be based on AP busyRx (not busySelf)
2021-12-07 14:31:16 -05:00
Christie Unitt
fa85300dc0 WIFI-6002 RadioUtilization.assocClientRx should be based on AP busyRx (not busySelf) 2021-12-01 14:35:43 -05:00
Thomas-Leung2021
20b29fdb5c Merge pull request #72 from Telecominfraproject/WIFI-3589
[Wifi 3589] Support channel bandwidth in AP status API
2021-11-15 13:52:20 -05:00
Thomas Leung
3470b01ea1 Merged in NETEXP-3580 (pull request #32)
[NETEXP-3580] fix failed test

Approved-by: mike.hansen
2021-11-15 13:47:04 -05:00
Thomas Leung
d3cffd570f Merged in NETEXP-3580 (pull request #30)
[NETEXP-3580] Opensync: support channel bandwidth in AP status API

Approved-by: mike.hansen
2021-11-15 13:46:41 -05:00
norm-traxler
753a4fdb89 Merge pull request #71 from Telecominfraproject/WIFI-5112-bugfix-passpoint-ssid-association
[WIFI-5112] Changing associatedAccessSsidProfileIds to Set<Long>
2021-10-26 15:57:27 -04:00
ralphlee
014bfa4189 [WIFI-5112] Changing associatedAccessSsidProfileIds to Set<Long> 2021-10-26 14:37:14 -04:00
Thomas-Leung2021
40ea53f87c Merge pull request #70 from Telecominfraproject/WIFI-4417-2
[WIFI-4417] add logic to always start with wan port for eth_ports configuration
2021-10-26 12:57:02 -04:00
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
45 changed files with 3271 additions and 3011 deletions

View File

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

View File

@@ -207,6 +207,9 @@ public class OpensyncCloudGatewayController {
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,
@@ -217,6 +220,8 @@ public class OpensyncCloudGatewayController {
}
});
return ret;
@@ -242,6 +247,8 @@ public class OpensyncCloudGatewayController {
public GatewayDefaults retrieveGatewayDefaults() {
return new GatewayDefaults();
}
/**
* Verify a route to customer equipment
@@ -254,7 +261,7 @@ 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(),
LOG.info("[E:{} R:{}] Stale routing entry ({}) detected", command.getInventoryId(), session.getRoutingId(),
command.getRoutingId());
return new EquipmentCommandResponse(CEGWCommandResultCode.NoRouteToCE, "Inactive Route Identifer", command,

View File

@@ -0,0 +1,382 @@
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.external.integration.OpensyncExternalIntegrationCloud;
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(apId, customerId, equipmentId, locationId, apEventClientSession);
}
if (apEventClientSession.hasClientDisconnectEvent()) {
processClientDisconnectEvent(apId, 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.hasBssid()) {
clientSession.getDetails().setBssid(MacAddress.valueOf(apClientEvent.getBssid()));
}
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.hasBssid()) {
clientSession.getDetails().setBssid(MacAddress.valueOf(apClientEvent.getBssid()));
}
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(String apId, 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());
}
String sessionId = clientSession.getDetails().getSessionId();
if (!Objects.equal(sessionId, Long.toUnsignedString(apEventClientSession.getSessionId()))) {
if (sessionId != null && !sessionId.startsWith(OpensyncExternalIntegrationCloud.DERIVED_SESSION_ID_PREFIX)) {
LOG.info("Ignored clientIpEvent for different session ID for AP {}, clientMac {}: currentSessionId {}, ipSessionID {} ", apId,
apClientEvent.getStaMac(), sessionId, apEventClientSession.getSessionId());
realtimeEventPublisher.publishClientIpEvent(customerId, equipmentId, locationId, apEventClientSession.getClientIpEvent());
return;
}
clientSession.getDetails().setPriorSessionId(sessionId);
}
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(String apId, 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())));
}
String sessionId = clientSession.getDetails().getSessionId();
if (!Objects.equal(sessionId, Long.toUnsignedString(apEventClientSession.getSessionId()))) {
if (sessionId != null && !sessionId.startsWith(OpensyncExternalIntegrationCloud.DERIVED_SESSION_ID_PREFIX)) {
LOG.info("Ignored clientDisconnectEvent for different session ID for AP {}, clientMac {}: currentSessionId {}, disconnectSessionID {} ", apId,
apClientEvent.getStaMac(), sessionId, apEventClientSession.getSessionId());
realtimeEventPublisher.publishClientDisconnectEvent(customerId, equipmentId, locationId, apEventClientSession.getClientDisconnectEvent());
return;
}
clientSession.getDetails().setPriorSessionId(sessionId);
}
clientSession.getDetails().setSessionId(Long.toUnsignedString(apEventClientSession.getSessionId()));
clientSession.getDetails().setRadioType(OvsdbToWlanCloudTypeMappingUtility.getRadioTypeFromOpensyncStatsRadioBandType(apClientEvent.getBand()));
clientSession.getDetails().setSsid(apClientEvent.getSsid());
if (apClientEvent.hasBssid()) {
clientSession.getDetails().setBssid(MacAddress.valueOf(apClientEvent.getBssid()));
}
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.setEventTimestamp(clientConnectEvent.getTimestampMs());
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());
@@ -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
@@ -340,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,7 +276,7 @@ public class RealtimeEventPublisher {
if (clientAssocEvent.hasUsing11V()) {
clientEvent.setUsing11v(clientAssocEvent.getUsing11V());
}
clientEvent.setEventTimestamp(clientAssocEvent.getTimestampMs());
clientEvent.setCustomerId(customerId);
clientEvent.setEquipmentId(equipmentId);
@@ -390,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.setEventTimestamp(clientFailureEvent.getTimestampMs());
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.setEventTimestamp(clientFirstDataEvent.getTimestampMs());
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.setEventTimestamp(clientIdEvent.getTimestampMs());
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);
@@ -473,11 +294,16 @@ 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);
@@ -486,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.setEventTimestamp(clientTimeoutEvent.getTimestampMs());
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
@@ -849,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()));
@@ -915,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) {
@@ -979,7 +494,7 @@ public class RealtimeEventPublisher {
if (apCallStop.hasSessionId()) {
cloudSipCallStopEvent.setAssociationId(apCallStop.getSessionId());
cloudSipCallStopEvent.setAssociationId(Long.toUnsignedString( apCallStop.getSessionId()));
}
@@ -1043,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);
@@ -1167,7 +682,7 @@ public class RealtimeEventPublisher {
}
if (apStreamVideoSessionStart.hasSessionId()) {
rtsStartSessionEvent.setSessionId(apStreamVideoSessionStart.getSessionId());
rtsStartSessionEvent.setSessionId(Long.toUnsignedString( apStreamVideoSessionStart.getSessionId()));
}
@@ -1178,7 +693,7 @@ public class RealtimeEventPublisher {
}
if (apStreamVideoSessionStart.hasVideoSessionId()) {
rtsStartSessionEvent.setVideoSessionId(apStreamVideoSessionStart.getVideoSessionId());
rtsStartSessionEvent.setVideoSessionId(Long.toUnsignedString( apStreamVideoSessionStart.getVideoSessionId()));
}
eventsList.add(rtsStartSessionEvent);
}
@@ -1208,7 +723,7 @@ public class RealtimeEventPublisher {
}
if (apStreamVideoStop.hasSessionId()) {
rtsStopEvent.setSessionId(apStreamVideoStop.getSessionId());
rtsStopEvent.setSessionId(Long.toUnsignedString( apStreamVideoStop.getSessionId()));
}
if (apStreamVideoStop.hasStreamingVideoType()) {
@@ -1223,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;
@@ -49,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;
@@ -65,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;
@@ -82,6 +85,7 @@ import com.telecominfraproject.wlan.status.equipment.models.EquipmentUpgradeStat
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;
@@ -90,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 {
@@ -133,7 +135,6 @@ public class OpensyncExternalIntegrationCloudTest {
@Autowired
OpensyncExternalIntegrationCloud opensyncExternalIntegrationCloud;
MockitoSession mockito;
@Configuration
@@ -170,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();
@@ -192,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);
@@ -222,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());
}
@@ -248,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);
@@ -264,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");
@@ -279,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();
@@ -307,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);
@@ -339,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());
}
@@ -352,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);
@@ -375,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);
@@ -412,7 +394,7 @@ public class OpensyncExternalIntegrationCloudTest {
@Test
public void testApDisconnected() {
opensyncExternalIntegrationCloud.apDisconnected("Test_Client_21P10C68818122");
opensyncExternalIntegrationCloud.apDisconnected("Test_Client_21P10C68818122", 0L);
}
@Test
@@ -440,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"));
@@ -467,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";
@@ -481,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();
@@ -491,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"));
@@ -504,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
@@ -581,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);
@@ -593,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);
@@ -601,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);
@@ -656,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");
@@ -680,7 +649,7 @@ public class OpensyncExternalIntegrationCloudTest {
protocolStatus.setStatusDataType(StatusDataType.PROTOCOL);
Mockito.when(statusServiceInterface.getOrNull(2, 1L, StatusDataType.PROTOCOL)).thenReturn(protocolStatus);
Status channelStatus = new Status();
channelStatus.setCustomerId(2);
channelStatus.setEquipmentId(1L);
@@ -718,23 +687,41 @@ public class OpensyncExternalIntegrationCloudTest {
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() {
@@ -753,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);
@@ -762,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
@@ -799,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);
@@ -831,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);
@@ -882,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

@@ -22,7 +22,11 @@ public interface OpensyncExternalIntegrationInterface {
INIT, INSERT, DELETE, MODIFY
}
void apDisconnected(String apId);
void apDisconnected(String apId, Long ctxRoutingId);
Long getLatestRoutingId(String apId);
void removeRoutingRecord(Long routingId);
OpensyncAPConfig getApConfig(String apId);
@@ -36,12 +40,6 @@ public interface OpensyncExternalIntegrationInterface {
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);
@@ -56,6 +54,14 @@ public interface OpensyncExternalIntegrationInterface {
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);
long getConfigVersionFromStatus(String apId);
void updateConfigVersionInStatus(String apId, long configVersionFromProfiles);
}

View File

@@ -4,6 +4,7 @@ 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;

View File

@@ -1,5 +1,7 @@
package com.telecominfraproject.wlan.opensync.external.integration;
import java.util.concurrent.atomic.AtomicInteger;
import com.vmware.ovsdb.service.OvsdbClient;
public class OvsdbSession {
@@ -7,7 +9,7 @@ public class OvsdbSession {
private String apId;
private long routingId;
private long equipmentId;
private int customerId;
private AtomicInteger currentConfigNumInFlight = new AtomicInteger();
public OvsdbClient getOvsdbClient() {
return ovsdbClient;
@@ -33,12 +35,9 @@ public class OvsdbSession {
public void setEquipmentId(long equipmentId) {
this.equipmentId = equipmentId;
}
public int getCustomerId() {
return customerId;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public AtomicInteger getCurrentConfigNumInFlight() {
return currentConfigNumInFlight;
}
}

View File

@@ -7,6 +7,8 @@ import java.util.Objects;
public class ConnectNodeInfo implements Cloneable {
public static String CONFIG_VERSION_PROPERTY_NAME = "tip/reportedCfgDataVersion";
public Map<String, String> mqttSettings = new HashMap<>();
public Map<String, String> versionMatrix = new HashMap<>();
public Map<String, String> wifiRadioStates = new HashMap<>();
@@ -35,6 +37,18 @@ public class ConnectNodeInfo implements Cloneable {
public String manufacturerDate;
public String certificationRegion;
public long getConfigVersion() {
long ret = 0;
try {
ret = Long.parseLong(versionMatrix.get(CONFIG_VERSION_PROPERTY_NAME));
} catch(Exception e) {
//do nothing
}
return ret;
}
@Override
public ConnectNodeInfo clone() {
try {

View File

@@ -1,6 +1,7 @@
package com.telecominfraproject.wlan.opensync.external.integration.models;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@@ -38,14 +39,73 @@ 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;
private List<Profile> captiveProfiles;
private List<Profile> bonjourGatewayProfiles;
private long configVersion;
private List<MacAddress> blockedClients;
public long getConfigVersion() {
//go through all child objects and get the most recent lastModifiedTimestamp from them
configVersion = 0;
if(customerEquipment!=null && customerEquipment.getLastModifiedTimestamp()> configVersion) {
configVersion = customerEquipment.getLastModifiedTimestamp();
}
if(hotspotConfig!=null) {
configVersion = getLatestLastMod(configVersion, hotspotConfig.getHotspot20OperatorSet());
configVersion = getLatestLastMod(configVersion, hotspotConfig.getHotspot20ProfileSet());
configVersion = getLatestLastMod(configVersion, hotspotConfig.getHotspot20ProviderSet());
configVersion = getLatestLastMod(configVersion, hotspotConfig.getHotspot20VenueSet());
}
configVersion = getLatestLastMod(configVersion, apProfile);
configVersion = getLatestLastMod(configVersion, rfProfile);
configVersion = getLatestLastMod(configVersion, ssidProfile);
configVersion = getLatestLastMod(configVersion, metricsProfile);
configVersion = getLatestLastMod(configVersion, radiusProfiles);
configVersion = getLatestLastMod(configVersion, wiredEthernetPortProfile);
if(equipmentLocation!=null && equipmentLocation.getLastModifiedTimestamp()> configVersion) {
configVersion = equipmentLocation.getLastModifiedTimestamp();
}
configVersion = getLatestLastMod(configVersion, captiveProfiles);
configVersion = getLatestLastMod(configVersion, bonjourGatewayProfiles);
return configVersion;
}
private long getLatestLastMod(long incomingLastMod, Collection<Profile> profiles) {
if(profiles!=null) {
for(Profile p: profiles) {
if(incomingLastMod < p.getLastModifiedTimestamp()) {
incomingLastMod = p.getLastModifiedTimestamp();
}
}
}
return incomingLastMod;
}
private long getLatestLastMod(long incomingLastMod, Profile profile) {
if(profile!=null) {
if(incomingLastMod < profile.getLastModifiedTimestamp()) {
incomingLastMod = profile.getLastModifiedTimestamp();
}
}
return incomingLastMod;
}
@Override
public OpensyncAPConfig clone() {
OpensyncAPConfig ret = (OpensyncAPConfig) super.clone();
@@ -136,7 +196,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 +256,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 +390,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

@@ -42,7 +42,7 @@ public class OpensyncAPRadioState extends OpensyncAPBase {
public Map<String, String> hwConfig;
public int channel;
public int txPower;
public String htMode;
public String htMode; // used in channel bandwidth
public int thermalDowngradeTemp;
public String hwMode;
public boolean enabled;

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

@@ -64,7 +64,7 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr
LOG.info("ConnectNodeInfo {}", connectNodeInfo);
}
public void apDisconnected(String apId) {
public void apDisconnected(String apId, Long ctxRoutingId) {
LOG.info("AP {} got disconnected from the gateway", apId);
}
@@ -207,4 +207,30 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr
}
@Override
public void nodeStateDbTableUpdate(List<Map<String, String>> nodeStateAttributes, String apId) {
LOG.info("nodeStateDbTableUpdate for AP {}", apId);
}
@Override
public long getConfigVersionFromStatus(String inventoryId) {
//0 means always push config to ap, do not do the version check for the configuration before pushing it
return 0;
}
@Override
public void updateConfigVersionInStatus(String apId, long configVersionFromProfiles) {
// do nothing here
}
@Override
public Long getLatestRoutingId(String apId) {
LOG.info("getLatestRoutingId for AP {}", apId);
return null;
}
@Override
public void removeRoutingRecord(Long routingId) {
LOG.info("removeRoutingRecord for routingId {}", routingId);
}
}

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

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

@@ -1,4 +1,6 @@
<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>
@@ -70,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,9 +21,8 @@ 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;
@@ -33,14 +33,11 @@ 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
@@ -54,19 +51,18 @@ public class OpensyncMqttClient implements ApplicationListener<ContextClosedEven
private final TagList tags = CloudMetricsTags.commonTags;
private final Counter messagesReceived = new BasicCounter(
MonitorConfig.builder("osgw-mqtt-messagesReceived").withTags(tags).build());
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());
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;
@Value("${tip.wlan.internalHostName:localhost}")
private String internalHostName;
// dtop: use anonymous constructor to ensure that the following code always
// get executed,
// even when somebody adds another constructor in here
@@ -85,8 +81,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,
@@ -114,9 +109,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.
/*
@@ -144,139 +139,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.setClientId("opensync_mqtt_" + internalHostName);
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/opensync_mqtt_" + internalHostName + "/#", 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();
messagesReceived.increment();
messageBytesReceived.increment(payload.length);
Stopwatch stopwatchTimerMessageProcess = timerMessageProcess.start();
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;
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
@@ -302,4 +229,5 @@ public class OpensyncMqttClient implements ApplicationListener<ContextClosedEven
mqttClientThread.interrupt();
}
}
}

View File

@@ -6,7 +6,6 @@ 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.Monitors;
import com.netflix.servo.tag.TagList;
import com.telecominfraproject.wlan.cloudmetrics.CloudMetricsTags;
import com.telecominfraproject.wlan.core.model.equipment.MacAddress;
@@ -19,16 +18,18 @@ 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.dao.OvsdbMonitor;
import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbClientWithMetrics;
import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbMetrics;
import com.telecominfraproject.wlan.opensync.util.OvsdbClientUtil;
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;
@@ -38,6 +39,7 @@ 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;
@@ -71,6 +73,12 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
@org.springframework.beans.factory.annotation.Value("${tip.wlan.defaultCommandDurationSec:3600}")
private long defaultCommandDurationSec;
@org.springframework.beans.factory.annotation.Value("${tip.wlan.checkConfigVersionFromStatus:true}")
private boolean checkBeforePushConfigVersionFromStatus;
@org.springframework.beans.factory.annotation.Value("${tip.wlan.checkConfigVersionFromAp:true}")
private boolean checkBeforePushConfigVersionFromAp;
@Autowired
private SslContext sslContext;
@@ -113,40 +121,53 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
@Override
public void connected(OvsdbClient ovsdbClient) {
connectionsAttempted.increment();
if (!(ovsdbClient instanceof OvsdbClientWithMetrics)) {
ovsdbClient = new OvsdbClientWithMetrics(ovsdbClient, ovsdbMetrics);
}
String remoteHost = ovsdbClient.getConnectionInfo().getRemoteAddress().getHostAddress();
int localPort = ovsdbClient.getConnectionInfo().getLocalPort();
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);
ConnectNodeInfo connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient);
// successfully connected - register it in our
// connectedClients table
String key = alterClientCnIfRequired(clientCn, connectNodeInfo);
ovsdbSessionMapInterface.newSession(key, ovsdbClient);
extIntegrationInterface.apConnected(key, connectNodeInfo);
processConnectRequest(ovsdbClient, clientCn, connectNodeInfo);
monitorOvsdbStateTables(ovsdbClient, key);
connectionsCreated.increment();
LOG.info("ovsdbClient connected from {} on port {} AP {} ", remoteHost, localPort, key);
LOG.info("ovsdbClient connectedClients = {}", ovsdbSessionMapInterface.getNumSessions());
if (clientCn != null && !clientCn.isEmpty()) {
LOG.info("ovsdbClient connecting from {} on port {} clientCn {}", remoteHost, localPort, clientCn);
ConnectNodeInfo connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient);
// successfully connected - register it in our
// connectedClients table
String key = alterClientCnIfRequired(clientCn, connectNodeInfo);
OvsdbSession ovsdbSession = ovsdbSessionMapInterface.newSession(key, ovsdbClient);
extIntegrationInterface.apConnected(key, connectNodeInfo);
// DT: at this point the routing Id is associated with the session, let's store it into the
// connectionInfo object so that the disconnect handler has access to it
OvsdbClientUtil.setRoutingId(ovsdbClient, ovsdbSession.getRoutingId());
processConnectRequest(ovsdbClient, clientCn, connectNodeInfo);
monitorOvsdbStateTables(ovsdbClient, key);
connectionsCreated.increment();
LOG.info("ovsdbClient connected from {} on port {} AP {} ", remoteHost, localPort, key);
LOG.info("ovsdbClient connectedClients = {}", ovsdbSessionMapInterface.getNumSessions());
} else {
LOG.debug("ovsdbClient: clientCn is empty - not connecting.");
}
} catch (IllegalStateException e) {
connectionsFailed.increment();
LOG.error("autoprovisioning error {}", e.getMessage(), e);
@@ -167,6 +188,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
connectionsDropped.increment();
String remoteHost;
int remotePort;
int localPort;
String clientCn;
@@ -182,25 +204,74 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
try {
remoteHost = ovsdbClient.getConnectionInfo().getRemoteAddress().getHostAddress();
remotePort = ovsdbClient.getConnectionInfo().getRemotePort();
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
}
clientCn = SslUtil.extractCN(subjectDn);
key = ovsdbSessionMapInterface.lookupClientId(ovsdbClient);
if (key != null) {
try {
extIntegrationInterface.apDisconnected(key);
ovsdbSessionMapInterface.removeSession(key);
} catch (Exception e) {
LOG.debug("Unable to process ap disconnect. {}", e.getMessage());
if (clientCn != null && !clientCn.isEmpty()) {
Long ctxRoutingId = OvsdbClientUtil.getRoutingId(ovsdbClient);
Long latestDbRoutingId = extIntegrationInterface.getLatestRoutingId(clientCn);
OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(clientCn);
LOG.info("Determine true disconnect with AP {} ctxRoutingId {} latestDbRoutingId {} ", clientCn, ctxRoutingId, latestDbRoutingId);
// Determine whether this is a true disconnect based on latest routing record
if (ctxRoutingId != null && latestDbRoutingId != null) {
// if context matches latest DB routingId, this is a true disconnect
if (ctxRoutingId.equals(latestDbRoutingId)) {
try {
extIntegrationInterface.apDisconnected(clientCn, ctxRoutingId);
ovsdbSessionMapInterface.removeSession(clientCn);
} catch (Exception e) {
LOG.debug("Unable to process ap disconnect. {}", e);
}
} else {
if (ovsdbSession != null) {
if (!latestDbRoutingId.equals(ovsdbSession.getRoutingId())) {
ovsdbSessionMapInterface.removeSession(clientCn);
}
}
extIntegrationInterface.removeRoutingRecord(ctxRoutingId);
}
// else, clearly handle all other cases
} else if (ctxRoutingId == null && latestDbRoutingId != null) {
// session was not initialized properly in connect path, we can remove this session
LOG.debug("ctxRoutingId null latestDbRoutingId {}, remove non-initialized session for AP {} ", latestDbRoutingId, clientCn);
if (ovsdbSession != null) {
if (ovsdbSession.getRoutingId() == 0L) {
ovsdbSessionMapInterface.removeSession(clientCn);
}
}
} else if (ctxRoutingId != null && latestDbRoutingId == null) {
// no routing exist at all, so we know this session is not using any routing record, we can remove this session
LOG.debug("ctxRoutingId {} latestDbRoutingId null, no routing exists, remove session for AP {} ", latestDbRoutingId, clientCn);
if (ovsdbSession != null) {
if (ctxRoutingId.equals(ovsdbSession.getRoutingId())) {
ovsdbSessionMapInterface.removeSession(clientCn);
}
}
} else {
// ctxRoutingId == null && latestDbRoutingId == null
// This session is not initialized properly and no routings exist for any session
// We can remove this session without any checks
LOG.debug("ctxRoutingId null latestDbRoutingId null, remove session for AP {} ", latestDbRoutingId, clientCn);
ovsdbSessionMapInterface.removeSession(clientCn);
}
LOG.info("ovsdbClient disconnected from {} on local port {} remote port {} clientCn {} ", remoteHost, localPort,
remotePort, clientCn);
LOG.info("ovsdbClient connectedClients = {}", ovsdbSessionMapInterface.getNumSessions());
}
LOG.info("ovsdbClient disconnected from {} on port {} clientCn {} AP {} ", remoteHost, localPort, clientCn, key);
LOG.info("ovsdbClient connectedClients = {}", ovsdbSessionMapInterface.getNumSessions());
} finally {
try {
ovsdbClient.shutdown();
@@ -229,23 +300,79 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
String apId = alterClientCnIfRequired(clientCn, connectNodeInfo);
LOG.debug("Client {} connect for AP {}", clientCn, apId);
OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
//get last known configVersion from the AP
long configVersionFromAp = checkBeforePushConfigVersionFromAp ? connectNodeInfo.getConfigVersion() : 0;
//get last known configVersion from the EquipmentProtocolStatusData
long configVersionFromStatus = checkBeforePushConfigVersionFromStatus ? extIntegrationInterface.getConfigVersionFromStatus(apId) : 0;
//get current configVersion from the profiles and equipment
long configVersionFromProfiles = opensyncAPConfig.getConfigVersion();
boolean needToPushConfigToAP = needToPushToAp(configVersionFromAp, configVersionFromStatus, configVersionFromProfiles);
if(needToPushConfigToAP) {
pushConfigToAp(ovsdbClient, opensyncAPConfig, apId, configVersionFromProfiles);
}
LOG.debug("Client connect Done");
}
private boolean needToPushToAp(long configVersionFromAp, long configVersionFromStatus, long configVersionFromProfiles) {
boolean ret = false;
if(configVersionFromAp == 0) {
LOG.debug("do not know what is on AP, let's push new config");
ret = true;
}
if(checkBeforePushConfigVersionFromAp && configVersionFromAp < configVersionFromProfiles ) {
LOG.debug("our profiles are more recent than what was pushed to AP previously, let's push new config");
ret = true;
}
if(checkBeforePushConfigVersionFromStatus && configVersionFromStatus < configVersionFromProfiles) {
LOG.debug("our profiles are more recent than the version stored in the protocol status, let's push new config");
ret = true;
}
if(!checkBeforePushConfigVersionFromAp && !checkBeforePushConfigVersionFromStatus) {
LOG.debug("we do not do any checks for config versions - let's push new config");
ret = true;
}
if(!ret) {
LOG.debug("no need to push new config to AP");
}
return ret;
}
private void pushConfigToAp(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig, String apInventoryId, long configVersionFromProfiles) {
ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
ovsdbDao.removeAllSsids(ovsdbClient); // always
ovsdbDao.removeAllInetConfigs(ovsdbClient);
if(opensyncAPConfig!=null) {
ovsdbDao.resetWiredPorts(ovsdbClient, opensyncAPConfig); // need to run this first before remove Status
}
ovsdbDao.removeWifiRrm(ovsdbClient);
ovsdbDao.removeRadsecRadiusAndRealmConfigs(ovsdbClient);
ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always
extIntegrationInterface.clearEquipmentStatus(apId);
OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
extIntegrationInterface.clearEquipmentStatus(apInventoryId);
if (opensyncAPConfig != null) {
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) {
@@ -259,15 +386,21 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) {
ovsdbDao.updateDeviceStatsReportingInterval(ovsdbClient, collectionIntervalSecDeviceStats);
}
ovsdbDao.enableNetworkProbeForSyntheticClient(ovsdbClient);
ovsdbDao.updateEventReportingInterval(ovsdbClient, collectionIntervalSecEvent);
} else {
LOG.info("No Configuration available for {}", apId);
LOG.info("No Configuration available for {}", apInventoryId);
}
//after a successful config push let's update the configVersion on the AP and in the EquipmentProtocolStatusData
if(checkBeforePushConfigVersionFromStatus) {
extIntegrationInterface.updateConfigVersionInStatus(apInventoryId, configVersionFromProfiles);
}
ovsdbDao.updateConfigVersionInNode(ovsdbClient, configVersionFromProfiles);
LOG.debug("Client connect Done");
}
@Override
public Set<String> getConnectedClientIds() {
return ovsdbSessionMapInterface.getConnectedClientIds();
@@ -287,7 +420,7 @@ 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) {
@@ -307,35 +440,56 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
OvsdbClient ovsdbClient = ovsdbSession.getOvsdbClient();
OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
if (opensyncAPConfig == null) {
LOG.warn("AP with id " + apId + " does not have a config to apply.");
return;
int currentConfigCount = ovsdbSession.getCurrentConfigNumInFlight().get();
if (currentConfigCount == 0L) {
// Current count is 0, start this config push
// Increment other incoming configs into the count until this config push is done
currentConfigCount = ovsdbSession.getCurrentConfigNumInFlight().incrementAndGet();
do {
try {
OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
if (opensyncAPConfig == null) {
LOG.warn("AP with id " + apId + " does not have a config to apply.");
return;
}
//get last known configVersion from the AP
long configVersionFromAp = checkBeforePushConfigVersionFromAp ? ovsdbDao.getConfigVersionFromNode(ovsdbClient) : 0;
//get last known configVersion from the EquipmentProtocolStatusData
long configVersionFromStatus = checkBeforePushConfigVersionFromStatus ? extIntegrationInterface.getConfigVersionFromStatus(apId) : 0;
//get current configVersion from the profiles and equipment
long configVersionFromProfiles = opensyncAPConfig.getConfigVersion();
boolean needToPushConfigToAP = needToPushToAp(configVersionFromAp, configVersionFromStatus, configVersionFromProfiles);
if(needToPushConfigToAP) {
pushConfigToAp(ovsdbClient, opensyncAPConfig, apId, configVersionFromProfiles);
}
LOG.debug("Finished processConfigChanged for {}", apId);
} catch (Exception ex) {
// If anything fails in the ovsdb config push, clean up count and exit
ovsdbSession.getCurrentConfigNumInFlight().set(0);
return;
}
int checkCount = ovsdbSession.getCurrentConfigNumInFlight().get();
if (checkCount == currentConfigCount) {
// Count didn't change from pre-config push, we can clean up and exit
if (ovsdbSession.getCurrentConfigNumInFlight().compareAndSet(currentConfigCount, 0)) {
return;
}
} else {
// Count has changed, update the currentConfigCount and rerun config push
ovsdbSession.getCurrentConfigNumInFlight().incrementAndGet();
}
} while (ovsdbSession.getCurrentConfigNumInFlight().get() != 0);
} else {
// Count is not 0, another request is being processed for this OvsdbSession
// Remember this request, and the other thread will check the count when it's done
ovsdbSession.getCurrentConfigNumInFlight().incrementAndGet();
}
ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
ovsdbDao.removeAllSsids(ovsdbClient); // always
ovsdbDao.removeAllInetConfigs(ovsdbClient);
ovsdbDao.removeWifiRrm(ovsdbClient);
ovsdbDao.removeRadsecRadiusAndRealmConfigs(ovsdbClient);
extIntegrationInterface.clearEquipmentStatus(apId);
ovsdbDao.configureNode(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig);
ovsdbDao.createVlanNetworkInterfaces(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureRadsecRadiusAndRealm(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig);
if (opensyncAPConfig.getHotspotConfig() != null) {
ovsdbDao.configureHotspots(ovsdbClient, opensyncAPConfig);
}
ovsdbDao.configureInterfaces(ovsdbClient);
ovsdbDao.configureWifiRadios(ovsdbClient, opensyncAPConfig);
LOG.debug("Finished processConfigChanged for {}", apId);
}
@Override
@@ -442,12 +596,12 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
if (rowUpdate.getNew() == null) {
// delete
Map<String, String> rowMap = new HashMap<>();
rowUpdate.getOld().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
delete.add(rowMap);
// delete
} else if (rowUpdate.getOld() == null) {
// insert
Map<String, String> rowMap = new HashMap<>();
@@ -456,15 +610,13 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
insert.add(rowMap);
} else {
// insert
// update
Map<String, String> rowMap = new HashMap<>();
rowUpdate.getOld().getColumns().putAll(rowUpdate.getNew().getColumns());
rowUpdate.getOld().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
update.add(rowMap);
}
}
}
@@ -488,7 +640,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
});
awCf.join();
extIntegrationInterface.dhcpLeasedIpDbTableUpdate(ovsdbDao.getInitialOpensyncDhcpLeasedIp(awCf.join(), key, ovsdbClient), key, RowUpdateOperation.INIT);
}
@@ -608,7 +760,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
}
});
extIntegrationInterface.wifiAssociatedClientsDbTableUpdate(ovsdbDao.getInitialOpensyncWifiAssociatedClients(acCf.join(), key, ovsdbClient), key);
}
@@ -624,7 +776,7 @@ 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) {
@@ -635,9 +787,9 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
}
}
// delete first
extIntegrationInterface.wifiInetStateDbTableUpdate(inetStateDelete, key);
extIntegrationInterface.wifiInetStateDbTableDelete(inetStateDelete, key);
// now process updates and mutations
extIntegrationInterface.wifiInetStateDbTableUpdate(inetStateInsertOrUpdate, key);
@@ -670,7 +822,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
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)))),
new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiVifStateDbTable, new MonitorRequest(new MonitorSelect(true, true, true, true)))),
tableUpdates -> {
try {
LOG.info(OvsdbDao.wifiVifStateDbTable + "_" + key + " monitor callback received {}", tableUpdates);
@@ -708,7 +860,19 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
}
});
vsCf.join();
try {
List<OpensyncAPVIFState> vifsToInsert = new ArrayList<>();
TableUpdates initialTableUpdates = vsCf.join();
for (TableUpdate tableUpdate : initialTableUpdates.getTableUpdates().values()) {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
vifsToInsert.addAll(ovsdbDao.getOpensyncApVifStateForRowUpdate(rowUpdate, key, ovsdbClient));
}
}
extIntegrationInterface.wifiVIFStateDbTableUpdate(vifsToInsert, key);
} catch (Exception e) {
LOG.error("initial wifiVIFStateDbTableUpdate failed", e);
}
}
@@ -716,20 +880,35 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
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 {}");
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());
}
});
});
extIntegrationInterface.nodeStateDbTableUpdate(processNodeStateTableUpdate(key, tableUpdates), key);
});
nsCf.join();
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 {

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;
@@ -14,13 +15,13 @@ 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.Monitors;
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;
@@ -77,11 +78,19 @@ public class TipWlanOvsdbRedirector {
ConnectionCallback connectionCallback = new ConnectionCallback() {
public void connected(OvsdbClient ovsdbClient) {
connectionsAttempted.increment();
String remoteHost = ovsdbClient.getConnectionInfo().getRemoteAddress().getHostAddress();
int localPort = ovsdbClient.getConnectionInfo().getLocalPort();
String subjectDn = null;
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);
@@ -101,7 +110,9 @@ public class TipWlanOvsdbRedirector {
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,7 @@ 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;
@@ -61,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,
@@ -85,8 +86,17 @@ public class OvsdbDao extends OvsdbDaoBase {
ovsdbNetwork.configureInterfaces(ovsdbClient);
}
public void configureWiredPort(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
ovsdbNetwork.configureEthernetPorts(ovsdbClient, opensyncAPConfig);
}
public void configureNode(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
configureNtpServer(ovsdbClient,opensyncAPConfig);configureSyslog(ovsdbClient, opensyncAPConfig);
configureNtpServer(ovsdbClient, opensyncAPConfig);
configureSyslog(ovsdbClient, opensyncAPConfig);
processBlinkRequest(ovsdbClient, opensyncAPConfig.getCustomerEquipment().getInventoryId(),
((ApElementConfiguration) opensyncAPConfig.getCustomerEquipment().getDetails()).isBlinkAllLEDs());
ovsdbNodeConfig.processLedControlEnabled(ovsdbClient, opensyncAPConfig);
processApcConfig(ovsdbClient, opensyncAPConfig);
}
void configureNtpServer(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
@@ -142,6 +152,11 @@ public class OvsdbDao extends OvsdbDaoBase {
OvsdbClient ovsdbClient) {
return ovsdbMonitor.getInitialOpensyncWifiAssociatedClients(join, key, ovsdbClient);
}
public List<Map<String, String>> getInitialOpensyncDhcpLeasedIp(TableUpdates join, String key,
OvsdbClient ovsdbClient) {
return ovsdbMonitor.getInitialOpensyncDhcpLeasedIp(join, key, ovsdbClient);
}
public Collection<? extends OpensyncAPInetState> getOpensyncApInetStateForRowUpdate(RowUpdate rowUpdate, String key,
OvsdbClient ovsdbClient) {
@@ -201,6 +216,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);
@@ -238,7 +257,19 @@ public class OvsdbDao extends OvsdbDaoBase {
}
public String processBlinkRequest(OvsdbClient ovsdbClient, String apId, boolean blinkAllLEDs) {
return ovsdbNodeConfig.processBlinkRequest(ovsdbClient,apId,blinkAllLEDs);
return ovsdbNodeConfig.processBlinkRequest(ovsdbClient, apId, blinkAllLEDs);
}
public void processApcConfig(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
ovsdbNodeConfig.configureDynamicRadiusProxyToAPC(ovsdbClient, opensyncAPConfig);
}
public long getConfigVersionFromNode(OvsdbClient ovsdbClient) {
return ovsdbNode.getConfigVersionFromNode(ovsdbClient);
}
public void updateConfigVersionInNode(OvsdbClient ovsdbClient, long configVersionFromProfiles) {
ovsdbNode.updateConfigVersionInNode(ovsdbClient, configVersionFromProfiles);
}
}

View File

@@ -265,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<>();
@@ -273,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);
@@ -292,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

@@ -40,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.
*

View File

@@ -83,6 +83,33 @@ public class OvsdbMonitor extends OvsdbDaoBase {
}
return ret;
}
List<Map<String, String>> getInitialOpensyncDhcpLeasedIp(TableUpdates tableUpdates, String apId,
OvsdbClient ovsdbClient) {
LOG.debug("getInitialOpensyncDhcpLeasedIp:");
List<Map<String, String>> ret = new ArrayList<>();
try {
LOG.debug(dhcpLeasedIpDbTable + "_" + apId + " initial monitor table state received {}",
tableUpdates);
for (TableUpdate tableUpdate : tableUpdates.getTableUpdates().values()) {
for (RowUpdate rowUpdate : tableUpdate.getRowUpdates().values()) {
if (rowUpdate.getNew() != null) {
Map<String, String> rowMap = new HashMap<>();
rowUpdate.getNew().getColumns().entrySet().forEach(c -> OvsdbDao.translateDhcpFpValueToString(c, rowMap));
ret.add(rowMap);
}
}
}
} catch (Exception e) {
throw (e);
}
return ret;
}
List<OpensyncAPInetState> getOpensyncApInetStateForRowUpdate(RowUpdate rowUpdate, String apId,
OvsdbClient ovsdbClient) {
@@ -93,6 +120,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();

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

@@ -32,6 +32,10 @@ import com.vmware.ovsdb.service.OvsdbClient;
@Component
public class OvsdbNode extends OvsdbDaoBase {
@org.springframework.beans.factory.annotation.Value("${tip.wlan.internalHostName:localhost}")
private String internalHostName;
String changeRedirectorAddress(OvsdbClient ovsdbClient, String apId, String newRedirectorAddress) {
try {
List<Operation> operations = new ArrayList<>();
@@ -238,7 +242,7 @@ public class OvsdbNode extends OvsdbDaoBase {
}
fillInLanIpAddressAndMac(ovsdbClient, ret, defaultLanInterfaceType);
fillInRadioInterfaceNames(ovsdbClient, ret);
fillInRadioInterfaceNamesAndCountry(ovsdbClient, ret);
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
@@ -380,7 +384,7 @@ public class OvsdbNode extends OvsdbDaoBase {
Map<String, String> newMqttSettings = new HashMap<>();
newMqttSettings.put("broker", mqttBrokerAddress);
String mqttClientName = OvsdbToWlanCloudTypeMappingUtility.getAlteredClientCnIfRequired(clientCn, incomingConnectNodeInfo, preventCnAlteration);
newMqttSettings.put("topics", "/ap/" + mqttClientName + "/opensync");
newMqttSettings.put("topics", "/ap/opensync_mqtt_" + internalHostName + "/" + mqttClientName + "/opensync");
newMqttSettings.put("port", "" + mqttBrokerExternalPort);
newMqttSettings.put("compress", "zlib");
newMqttSettings.put("qos", "0");
@@ -417,4 +421,96 @@ public class OvsdbNode extends OvsdbDaoBase {
return ret;
}
public long getConfigVersionFromNode(OvsdbClient ovsdbClient) {
long ret = 0;
Map<String, String> versionMatrix = getVersionMatrixFromNode(ovsdbClient);
try {
ret = Long.parseLong(versionMatrix.get(ConnectNodeInfo.CONFIG_VERSION_PROPERTY_NAME));
} catch(Exception e) {
//do nothing
}
LOG.debug("getConfigVersionFromNode {}", ret);
return ret;
}
public Map<String, String> getVersionMatrixFromNode(OvsdbClient ovsdbClient) {
Map<String, String> ret = new HashMap<>();
try {
List<Operation> operations = new ArrayList<>();
List<Condition> conditions = new ArrayList<>();
List<String> columns = new ArrayList<>();
columns.add("version_matrix");
columns.add("id");
operations.add(new Select(awlanNodeDbTable, conditions, columns));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
if (LOG.isDebugEnabled()) {
LOG.debug("Select from {}:", awlanNodeDbTable);
for (OperationResult res : result) {
LOG.debug("Op Result {}", res);
}
}
Row row = null;
if ((result != null) && (result.length > 0) && (result[0] instanceof SelectResult) && !((SelectResult) result[0]).getRows().isEmpty()) {
row = ((SelectResult) result[0]).getRows().iterator().next();
}
if( row != null ) {
ret = row.getMapColumn("version_matrix");
}
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
LOG.debug("getVersionMatrixFromNode {}", ret);
return ret;
}
public void updateConfigVersionInNode(OvsdbClient ovsdbClient, long configVersionFromProfiles) {
try {
//get original version_matrix map value
Map<String, String> versionMatrix = getVersionMatrixFromNode(ovsdbClient);
//update our config version in version_matrix map
versionMatrix.put(ConnectNodeInfo.CONFIG_VERSION_PROPERTY_NAME, Long.toString(configVersionFromProfiles));
//update the version_matrix column
List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>();
@SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, String> ovsdbVersionMatrix =
com.vmware.ovsdb.protocol.operation.notation.Map.of(versionMatrix);
updateColumns.put("version_matrix", ovsdbVersionMatrix);
Row row = new Row(updateColumns);
operations.add(new Update(awlanNodeDbTable, row));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult r : result) {
LOG.debug("Op Result {}", r);
}
LOG.debug("updateConfigVersionInNode {}", configVersionFromProfiles);
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -2,6 +2,7 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -14,6 +15,7 @@ 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.opensync.ovsdb.dao.models.WifiVifConfigInfo;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.Delete;
@@ -25,6 +27,7 @@ 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.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;
@@ -120,24 +123,71 @@ public class OvsdbNodeConfig extends OvsdbDaoBase {
}
public String processBlinkRequest(OvsdbClient ovsdbClient, String apId, boolean blinkAllLEDs) {
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("processBlinkRequest set BlinkLEDs to {}", blinkAllLEDs);
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"));
columns.put("value", new Atom<>("on"));
} else {
columns.put("module", new Atom<>("led"));
columns.put("key", new Atom<>("led_off"));
columns.put("value", new Atom<>("off"));
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)));
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;
@@ -161,10 +211,37 @@ public class OvsdbNodeConfig extends OvsdbDaoBase {
}
}
}
return ret;
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
}
public void configureDynamicRadiusProxyToAPC(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
ApNetworkConfiguration apNetworkConfig = (ApNetworkConfiguration) opensyncAPConfig.getApProfile()
.getDetails();
if (apNetworkConfig.isDynamicRadiusProxyEnabled() == null) {
LOG.info("Cannot configure isDynamicRadiusProxyEnabled to null value. {}", apNetworkConfig);
return;
}
Boolean isApcEnabled = apNetworkConfig.isDynamicRadiusProxyEnabled();
try {
if (ovsdbClient.getSchema(ovsdbName).get().getTables().containsKey(apcConfigDbTable)) {
Map<String, Value> columns = new HashMap<>();
columns.put("enabled", new Atom<>(isApcEnabled));
List<Operation> operations = new ArrayList<>();
operations.add(new Update(apcConfigDbTable, new Row(columns)));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
LOG.debug("configureDynamicRadiusProxyToAPC result {} ", Arrays.toString(result));
}
} catch (InterruptedException | ExecutionException | OvsdbClientException | TimeoutException e) {
LOG.error("Unable to configureDynamicRadiusProxyToAPC on AP.", e);
throw new RuntimeException(e);
}
}
}

View File

@@ -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;
@@ -39,88 +40,100 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
Map<String, WifiRadioConfigInfo> provisionedRadioConfigs = ovsdbGet.getProvisionedWifiRadioConfigs(ovsdbClient);
Map<String, WifiVifConfigInfo> vifConfigs = ovsdbGet.getProvisionedWifiVifConfigs(ovsdbClient);
List<Operation> operations = new ArrayList<>();
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);
LOG.debug("configureWifiRadios autoChannelSelection {} activeChannel {} getChannelNumber {} ", autoChannelSelection, channel,
elementRadioConfig.getChannelNumber());
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;
}
}
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);
} 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<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);
}
}
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
LOG.debug("Op Result {}", res);
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());
});
} catch (OvsdbClientException | ExecutionException | InterruptedException | TimeoutException e) {
LOG.error("configureWifiRadios error", e);
throw new RuntimeException(e);
@@ -227,7 +240,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
}
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)
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<>();
@@ -253,7 +266,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
updateColumns.put("hw_mode", new Atom<>(hwMode));
}
configureCustomOptionsMap(maxNumClients, updateColumns);
setTxAndRxChainmask(mimoMode, 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);
updateColumns.put("vif_configs", vifConfigUuids);
@@ -270,7 +283,7 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
updateColumns.put("custom_options", customOptionsMap);
}
void setTxAndRxChainmask(int mimoMode, Map<String, Value> updateColumns) {
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
@@ -314,7 +327,9 @@ public class OvsdbRadioConfig extends OvsdbDaoBase {
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

@@ -20,7 +20,6 @@ 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;
@@ -37,24 +36,6 @@ 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 {
@@ -97,26 +78,37 @@ public class OvsdbRadiusProxyConfig extends OvsdbDaoBase {
for (RadiusProxyConfiguration rsc : ((ApNetworkConfiguration) apConfig.getApProfile().getDetails()).getRadiusProxyConfigurations()) {
Map<String, Value> updateColumns = new HashMap<>();
updateColumns.put("server", new Atom<>(rsc.getServer().getHostAddress()));
getCertificateUrls(rsc, updateColumns);
updateColumns.put("radius_config_name", new Atom<>(rsc.getName()));
updateColumns.put("passphrase", new Atom<>(rsc.getPassphrase()));
updateColumns.put("port", new Atom<>(rsc.getPort()));
updateColumns.put("realm", Set.of(rsc.getRealm()));
updateColumns.put("radsec", new Atom<>(rsc.getUseRadSec()));
updateColumns.put("secret", new Atom<>(rsc.getSharedSecret()));
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()));
}
updateColumns.put("acct_secret", new Atom<>(rsc.getAcctSharedSecret()));
}
if (rsc.getAcctPort() != null) {
updateColumns.put("acct_port", new Atom<>(rsc.getAcctPort()));
}
if( databaseSchema.getTables().get(radiusConfigDbTable).getColumns().containsKey("auto_discover") ){
if (rsc.getUseRadSec() && rsc.getDynamicDiscovery()) {
}
if (rsc.getRadiusProxySecret() != null) {
updateColumns.put("proxy_secret", new Atom<>(rsc.getRadiusProxySecret()));
}
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");
@@ -131,7 +123,6 @@ public class OvsdbRadiusProxyConfig extends OvsdbDaoBase {
updateColumns.put("auto_discover", new Atom<>(false));
}
}
Row row = new Row(updateColumns);
operations.add(new Insert(radiusConfigDbTable, row));
}

View File

@@ -5,6 +5,7 @@ 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;
@@ -41,6 +42,7 @@ 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
@@ -49,6 +51,7 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
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) {
@@ -138,60 +141,76 @@ public class OvsdbRrmConfig extends OvsdbDaoBase {
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 (multicastRate == null || multicastRate == MulticastRate.auto) {
updateColumns.put("mcast_rate", new Atom<>(0));
} else {
updateColumns.put("mcast_rate", new Atom<>(multicastRate.getId()));
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) {
updateColumns.put("probe_resp_threshold", new com.vmware.ovsdb.protocol.operation.notation.Set());
} else {
updateColumns.put("probe_resp_threshold", new Atom<>(probeResponseThreshold.intValue()));
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 (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 (columnNames.contains("beacon_rate")) {
if (managementRate == null || managementRate == ManagementRate.auto) {
updateColumns.put("beacon_rate", new Atom<>(0));
} else {
updateColumns.put("beacon_rate", new Atom<>(managementRate.getId() * 10));
}
}
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 (managementRate == null || managementRate == ManagementRate.auto) {
updateColumns.put("beacon_rate", new Atom<>(0));
} else {
updateColumns.put("beacon_rate", new Atom<>(managementRate.getId() * 10));
}
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) {
if (obssHopMode != null && columnNames.contains("obss_hop_mode"))
{
updateColumns.put("obss_hop_mode", new Atom<>(obssHopMode.equals(OBSSHopMode.NON_WIFI) ? 1 : 2));
}
updateColumns.put("noise_floor_thresh", new Atom<>(noiseFloorThresholdInDB));
updateColumns.put("noise_floor_time", new Atom<>(noiseFloorThresholdTimeInSeconds));
updateColumns.put("non_wifi_thresh", new Atom<>(nonWifiThresholdInPercentage));
updateColumns.put("non_wifi_time", new Atom<>(nonWifiThresholdTimeInSeconds));
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));

View File

@@ -19,6 +19,7 @@ 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;
import com.telecominfraproject.wlan.profile.network.models.RadiusProxyConfiguration;
import com.telecominfraproject.wlan.profile.radius.models.RadiusProfile;
import com.telecominfraproject.wlan.profile.radius.models.RadiusServer;
import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
@@ -59,8 +60,6 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
OvsdbNetworkConfig networkConfig;
@Autowired
OvsdbNode ovsdbNode;
@Autowired
OvsdbRadiusProxyConfig radsecConfig;
protected void getEnabledRadios(OvsdbClient ovsdbClient, List<RadioType> radios) {
try {
@@ -445,7 +444,7 @@ 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
@@ -490,6 +489,11 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
enable80211k = ssidConfig.getRadioBasedConfigs().get(radioType).getEnable80211k();
}
}
boolean useRadiusProxy = false;
if (ssidConfig.getUseRadiusProxy() != null) {
useRadiusProxy = ssidConfig.getUseRadiusProxy();
}
Map<String, String> security = new HashMap<>();
String ssidSecurityMode = ssidConfig.getSecureMode().name();
@@ -500,7 +504,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
String radiusOperName = null;
opensyncSecurityMode = getOpensyncSecurityMode(ssidSecurityMode, opensyncSecurityMode);
populateSecurityMap(opensyncApConfig, ssidConfig, security, ssidSecurityMode, opensyncSecurityMode);
populateSecurityMap(opensyncApConfig, ssidConfig, useRadiusProxy, security, ssidSecurityMode, opensyncSecurityMode);
int dynamicVlan = 0;
if (opensyncSecurityMode.endsWith("EAP")) {
@@ -548,13 +552,19 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
interfacesPerFreqBand.put(freqBand, 1);
}
boolean useRadiusProxy = false;
if (ssidConfig.getUseRadiusProxy() != null) {
useRadiusProxy = ssidConfig.getUseRadiusProxy();
if (useRadiusProxy) {
// AP requires proxy secret in security during auto radius proxy
for (RadiusProxyConfiguration rsc : ((ApNetworkConfiguration) opensyncApConfig.getApProfile().getDetails()).getRadiusProxyConfigurations()) {
if (rsc.getRadiusProxySecret() != null) {
security.put("radius_server_secret", rsc.getRadiusProxySecret());
security.put("radius_acct_secret", rsc.getRadiusProxySecret());
}
}
}
boolean enableProxyArpForHotspot = false;
if (ssidConfig.getEnableProxyArpForHotspot() != null) {
enableProxyArpForHotspot = false;
enableProxyArpForHotspot = ssidConfig.getEnableProxyArpForHotspot();
}
try {
configureSingleSsid(ovsdbClient, ifName, ssidConfig.getSsid(), ssidBroadcast, security, vlanId, rrmEnabled, enable80211r, mobilityDomain,
@@ -564,11 +574,6 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
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);
}
} catch (IllegalStateException e) {
// could not provision this SSID, but still can go on
LOG.warn("could not provision SSID {} on {}", ssidConfig.getSsid(), freqBand);
@@ -643,10 +648,8 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
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());
}
if (captiveProfileDetails.getAuthenticationType().equals(CaptivePortalAuthenticationType.radius)) {
Optional<Profile> optional =
@@ -763,6 +766,9 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
case "wpa3MixedEAP":
opensyncSecurityMode = "WPA3-EAP";
break;
case "wpa3OnlyEAP192":
opensyncSecurityMode = "WPA3-EAP-192";
break;
}
return opensyncSecurityMode;
}
@@ -779,11 +785,11 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
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_port", rServer.getPort() != null ? String.valueOf(rServer.getPort()) : null);
security.put("radius_acct_secret", rServer.getSecret());
RadiusServer radiusAcctServerPrimary = profileDetails.getPrimaryRadiusAccountingServer();
if (radiusAcctServerPrimary != null) {
security.put("radius_acct_ip", radiusAcctServerPrimary.getIpAddress() != null ? radiusAcctServerPrimary.getIpAddress().getHostAddress() : null);
security.put("radius_acct_port", radiusAcctServerPrimary.getPort() != null ? String.valueOf(radiusAcctServerPrimary.getPort()) : null);
security.put("radius_acct_secret", radiusAcctServerPrimary.getSecret());
if (ssidConfig.getRadiusAcountingServiceInterval() != null && ssidConfig.getRadiusAcountingServiceInterval() > 0) {
// if the value is present, use the
@@ -791,11 +797,23 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
security.put("radius_acct_interval", ssidConfig.getRadiusAcountingServiceInterval().toString());
}
LOG.info("set Radius Accounting server attributes radius_acct_ip {} radius_acct_port {} radius_acct_secret {} radius_acct_interval {}",
LOG.info("Set Primary 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");
LOG.info("No Primary Radius Accounting Server defined in Radius Profile");
}
RadiusServer radiusAcctServerSecondary = profileDetails.getSecondaryRadiusAccountingServer();
if (radiusAcctServerSecondary != null) {
security.put("radius_acct_ip_secondary", radiusAcctServerSecondary.getIpAddress() != null ? radiusAcctServerSecondary.getIpAddress().getHostAddress() : null);
security.put("radius_acct_port_secondary", radiusAcctServerSecondary.getPort() != null ? String.valueOf(radiusAcctServerSecondary.getPort()) : null);
security.put("radius_acct_secret_secondary", radiusAcctServerSecondary.getSecret());
LOG.info("Set Secondary Radius Accounting server attributes radius_acct_ip_secondary {} radius_acct_port_secondary {} radius_acct_secret_secondary {}",
security.get("radius_acct_ip_secondary"), security.get("radius_acct_port_secondary"), security.get("radius_acct_secret_secondary"));
} else {
LOG.info("No Secondary Radius Accounting Server defined in Radius Profile");
}
} else {
@@ -820,8 +838,19 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
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"),
LOG.info("Set Primary 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"));
RadiusServer radiusServerSecondary = profileDetails.getSecondaryRadiusAuthServer();
if (radiusServerSecondary != null) {
security.put("radius_server_ip_secondary", radiusServerSecondary.getIpAddress() != null ? radiusServerSecondary.getIpAddress().getHostAddress() : null);
security.put("radius_server_port_secondary", radiusServerSecondary.getPort() != null ? String.valueOf(radiusServerSecondary.getPort()) : null);
security.put("radius_server_secret_secondary", radiusServerSecondary.getSecret());
LOG.info("Set Secondary Radius server attributes radius_server_ip_secondary {} radius_server_port_secondary {} radius_server_secret_secondary {}",
security.get("radius_server_ip_secondary"), security.get("radius_server_port_secondary"), security.get("radius_server_secret_secondary"));
} else {
LOG.info("No Secondary Radius Authentication Server defined in Radius Profile");
}
} else {
LOG.warn("Could not find radius profile {} in {}", ssidConfig.getRadiusServiceId(), opensyncApConfig.getRadiusProfiles());
}
@@ -837,7 +866,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @param ssidSecurityMode
* @param opensyncSecurityMode
*/
void populateSecurityMap(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Map<String, String> security, String ssidSecurityMode,
void populateSecurityMap(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Boolean useRadiusProxy, Map<String, String> security, String ssidSecurityMode,
String opensyncSecurityMode) {
security.put("encryption", opensyncSecurityMode);
// key and mode is N/A for OPEN security
@@ -864,14 +893,21 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
case "wpa2OnlyEAP":
case "wpa2OnlyRadius":
security.put("mode", "2");
if (!ssidConfig.getUseRadiusProxy()) {
if (!useRadiusProxy) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
break;
case "wpa3OnlyEAP":
security.put("mode", "3");
if (!ssidConfig.getUseRadiusProxy()) {
if (!useRadiusProxy) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
break;
case "wpa3OnlyEAP192":
security.put("mode", "3");
if (!useRadiusProxy) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
@@ -880,7 +916,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
case "wpa2Radius":
case "wpa3MixedEAP":
security.put("mode", "mixed");
if (!ssidConfig.getUseRadiusProxy()) {
if (!useRadiusProxy) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
@@ -888,7 +924,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
case "wpaEAP":
case "wpaRadius":
security.put("mode", "1");
if (!ssidConfig.getUseRadiusProxy()) {
if (!useRadiusProxy) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}

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);
}
@@ -248,7 +243,6 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
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) {
@@ -280,6 +275,7 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
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));
@@ -299,6 +295,7 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
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));
@@ -355,7 +352,7 @@ public class OvsdbStatsConfig extends OvsdbDaoBase {
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

@@ -25,6 +25,10 @@ public class OvsdbClientWithMetrics implements OvsdbClient {
this.delegate = delegate;
this.metrics = metrics;
}
public OvsdbClient getDelegate() {
return delegate;
}
public CompletableFuture<String[]> listDatabases() throws OvsdbClientException {
metrics.listDatabases.increment();

View File

@@ -0,0 +1,65 @@
package com.telecominfraproject.wlan.opensync.util;
import java.lang.reflect.Field;
import com.telecominfraproject.wlan.opensync.ovsdb.metrics.OvsdbClientWithMetrics;
import com.vmware.ovsdb.service.OvsdbClient;
import com.vmware.ovsdb.service.impl.OvsdbClientImpl;
import io.netty.channel.Channel;
import io.netty.util.AttributeKey;
/**
* Uses reflection to associate routingId with low-level netty channel.
*
* @author dtop
*
*/
public class OvsdbClientUtil {
public static final AttributeKey<String> routingRecordIdAttrKey = AttributeKey.valueOf("routingRecordId");
public static void setRoutingId(OvsdbClient ovsdbClient, long routingId) {
Channel channel = getChannel(ovsdbClient);
channel.attr(routingRecordIdAttrKey).set(Long.toString(routingId));
}
public static Long getRoutingId(OvsdbClient ovsdbClient) {
Channel channel = getChannel(ovsdbClient);
String strVal = channel.attr(routingRecordIdAttrKey).get();
return strVal==null?null:Long.parseLong(strVal);
}
private static Channel getChannel(OvsdbClient ovsdbClient) {
if(ovsdbClient instanceof OvsdbClientWithMetrics) {
//unwrap the object, if needed
ovsdbClient = ((OvsdbClientWithMetrics) ovsdbClient).getDelegate();
}
if(! (ovsdbClient instanceof OvsdbClientImpl)) {
throw new RuntimeException("Do not know how to handle "+ ovsdbClient.getClass().getName()+" - expected OvsdbClientImpl");
}
try {
Field jsonRpcClientField = ovsdbClient.getClass().getDeclaredField("jsonRpcClient");
jsonRpcClientField.setAccessible(true);
Object jsonRpcClientObj = jsonRpcClientField.get(ovsdbClient);
Field transporterField = jsonRpcClientObj.getClass().getDeclaredField("transporter");
transporterField.setAccessible(true);
Object transporterObj = transporterField.get(jsonRpcClientObj);
Field channelField = transporterObj.getClass().getDeclaredField("val$channel");
channelField.setAccessible(true);
Channel channel = (Channel) channelField.get(transporterObj);
return channel;
}catch(Exception e) {
throw new RuntimeException("Cannot get the channel for the ovsdbClient "+ ovsdbClient, e);
}
}
}

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

@@ -123,7 +123,6 @@ public class OpensyncGatewayTipWlanOvsdbClientTest {
Mockito.when(ovsdbSessionMapInterface.getSession("Test_Client_21P10C68818122")).thenReturn(ovsdbSession);
OpensyncAPConfig apConfig = Mockito.mock(OpensyncAPConfig.class, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(apConfig.getApProfile().getDetails()).thenReturn(Mockito.mock(ApNetworkConfiguration.class));
Mockito.when(opensyncExternalIntegrationInterface.getApConfig(Mockito.anyString())).thenReturn(apConfig);

View File

@@ -34,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;
@@ -46,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;
@@ -68,8 +67,8 @@ import com.vmware.ovsdb.service.OvsdbClient;
@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
OvsdbNodeConfig.class, OvsdbRadiusProxyConfig.class, StatusServiceLocal.class, StatusController.class,
CloudEventDispatcherEmpty.class, StatusDatastoreInMemory.class
})
public class OvsdbDaoTest {

View File

@@ -104,7 +104,7 @@ public class OvsdbDaoTestUtilities {
((PasspointProfile) passpointHotspotConfig.getDetails()).setOsuSsidProfileId(profileSsidOpen.getId());
profileSsidPsk.getChildProfileIds().add(passpointHotspotConfig.getId());
((PasspointProfile) passpointHotspotConfig.getDetails())
.setAssociatedAccessSsidProfileIds(List.of(profileSsidPsk.getId()));
.setAssociatedAccessSsidProfileIds(Set.of(profileSsidPsk.getId()));
return passpointHotspotConfig;
}

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

@@ -14,6 +14,7 @@ import org.mockito.Mockito;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.mock.mockito.MockBean;
@@ -23,8 +24,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 +41,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,OvsdbRadiusProxyConfig.class
OvsdbNodeConfig.class,OvsdbRadiusProxyConfig.class, StatusServiceLocal.class, StatusController.class,
CloudEventDispatcherEmpty.class, StatusDatastoreInMemory.class
})
public class OvsdbNodeTest {
@@ -81,7 +86,10 @@ public class OvsdbNodeTest {
OvsdbRadiusProxyConfig ovsdbRadiusProxyConfig;
@MockBean(answer = Answers.RETURNS_MOCKS)
OvsdbGet ovsdbGet;
@Value("${tip.wlan.internalHostName:localhost}")
private String internalHostName;
MockitoSession mockito;
@Configuration
@@ -118,7 +126,7 @@ public class OvsdbNodeTest {
newMqttSettings.put("broker", ovsdbNode.mqttBrokerAddress);
String mqttClientName = OvsdbToWlanCloudTypeMappingUtility.getAlteredClientCnIfRequired("AP-1", connectNodeInfo,
false);
newMqttSettings.put("topics", "/ap/" + mqttClientName + "/opensync");
newMqttSettings.put("topics", "/ap/opensync_mqtt_" + internalHostName + "/" + mqttClientName + "/opensync");
newMqttSettings.put("port", "" + ovsdbNode.mqttBrokerExternalPort);
newMqttSettings.put("compress", "zlib");
newMqttSettings.put("qos", "0");

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,OvsdbRadiusProxyConfig.class
OvsdbNodeConfig.class, OvsdbRadiusProxyConfig.class, StatusServiceLocal.class, StatusController.class,
CloudEventDispatcherEmpty.class, StatusDatastoreInMemory.class
})
public class OvsdbSsidConfigTest {