From bb3a49addbfbdd7a51dce2f34ddd18974d64bb2b Mon Sep 17 00:00:00 2001 From: Mike Hansen Date: Fri, 25 Sep 2020 17:13:51 -0400 Subject: [PATCH] Support for Metrics Profile Added to OpensyncAPConfig Added Profiles for Static. Added handler in OvsdbClient to process. Currently not applying the values, uses the defaults still, but remaining functionality will come in subsequent updates. --- .../OpensyncExternalIntegrationCloud.java | 2 + .../integration/models/OpensyncAPConfig.java | 16 ++++++ .../OpensyncExternalIntegrationSimple.java | 7 +++ .../src/main/resources/ProfileMetrics.json | 53 +++++++++++++++++++ .../app/opensync/EquipmentExample.json | 3 ++ .../app/opensync/ProfileMetrics.json | 53 +++++++++++++++++++ .../docker/app/opensync/EquipmentExample.json | 3 ++ .../docker/app/opensync/ProfileMetrics.json | 53 +++++++++++++++++++ .../app/opensync/EquipmentExample.json | 3 ++ .../opensync/ovsdb/TipWlanOvsdbClient.java | 4 +- .../wlan/opensync/ovsdb/dao/OvsdbDao.java | 46 +++++++++++++--- ...OpensyncGatewayTipWlanOvsdbClientTest.java | 2 +- 12 files changed, 236 insertions(+), 9 deletions(-) create mode 100644 opensync-ext-static/src/main/resources/ProfileMetrics.json create mode 100644 opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/ProfileMetrics.json create mode 100644 opensync-gateway-static-docker/src/main/docker/app/opensync/ProfileMetrics.json diff --git a/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java b/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java index 5500de4..e0c402c 100644 --- a/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java +++ b/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java @@ -764,6 +764,8 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra ret.setSsidProfile( profileContainer.getChildrenOfType(equipmentConfig.getProfileId(), ProfileType.ssid)); + + ret.setMetricsProfiles(profileContainer.getChildrenOfType(equipmentConfig.getProfileId(), ProfileType.metrics)); Set radiusSet = new HashSet<>(); Set captiveProfileIds = new HashSet<>(); diff --git a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPConfig.java b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPConfig.java index 3cb1a2f..5c405d2 100644 --- a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPConfig.java +++ b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPConfig.java @@ -31,6 +31,7 @@ public class OpensyncAPConfig extends BaseJsonModel { private Profile apProfile; private Profile rfProfile; private List ssidProfile; + private List metricsProfile; private List radiusProfiles; private Location equipmentLocation; private EquipmentRoutingRecord equipmentRouting; @@ -195,6 +196,13 @@ public class OpensyncAPConfig extends BaseJsonModel { } ret.ssidProfile = ssidList; } + if (metricsProfile != null) { + List metricsList = new ArrayList(); + for (Profile profile : metricsProfile) { + metricsList.add(profile.clone()); + } + ret.metricsProfile = metricsList; + } if (bonjourGatewayProfiles != null) { List bonjourGatewayProfilesList = new ArrayList(); for (Profile profile : bonjourGatewayProfiles) { @@ -255,4 +263,12 @@ public class OpensyncAPConfig extends BaseJsonModel { public void setBlockedClients(List blockedClients) { this.blockedClients = blockedClients; } + + public void setMetricsProfiles(List metricsProfileList) { + metricsProfile = metricsProfileList; + } + + public List getMetricsProfiles() { + return metricsProfile; + } } diff --git a/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java b/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java index 3519c1e..f32eb6a 100644 --- a/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java +++ b/opensync-ext-static/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationSimple.java @@ -45,6 +45,9 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr @Value("${tip.wlan.ovsdb.ssidProfileFileName:/app/config/ProfileSsid.json}") private String ssidProfileFileName; + @Value("${tip.wlan.ovsdb.ssidProfileFileName:/app/config/ProfileMetrics.json}") + private String metricsProfileFileName; + @Value("${tip.wlan.ovsdb.radiusProfileFileName:/app/config/ProfileRadius.json}") private String radiusProfileFileName; @@ -99,6 +102,9 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr .listFromFile(ssidProfileFileName, com.telecominfraproject.wlan.profile.models.Profile.class); ssidProfiles.stream().forEach(p -> apProfile.getChildProfileIds().add(p.getId())); + + List metricsProfiles = com.telecominfraproject.wlan.profile.models.Profile + .listFromFile(metricsProfileFileName, com.telecominfraproject.wlan.profile.models.Profile.class); List radiusProfiles = com.telecominfraproject.wlan.profile.models.Profile .listFromFile(radiusProfileFileName, com.telecominfraproject.wlan.profile.models.Profile.class); @@ -132,6 +138,7 @@ public class OpensyncExternalIntegrationSimple implements OpensyncExternalIntegr ret.setCustomerEquipment(equipment); ret.setApProfile(apProfile); ret.setRfProfile(rfProfile); + ret.setMetricsProfiles(metricsProfiles); ret.setSsidProfile(ssidProfiles); ret.setRadiusProfiles(radiusProfiles); ret.setEquipmentLocation(location); diff --git a/opensync-ext-static/src/main/resources/ProfileMetrics.json b/opensync-ext-static/src/main/resources/ProfileMetrics.json new file mode 100644 index 0000000..4b38dbb --- /dev/null +++ b/opensync-ext-static/src/main/resources/ProfileMetrics.json @@ -0,0 +1,53 @@ +[ +{ + "model_type": "Profile", + "id": 222, + "customerId": 2, + "profileType": "metrics", + "name": "Metrics-Profile-3-radios", + "details": { + "model_type": "ServiceMetricsCollectionConfigProfile", + "radioTypeList": [ + "is2dot4GHz", + "is5GHzL", + "is5GHzU" + ], + "metricConfigParameterMap": { + "Neighbour": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Neighbour", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApSsid": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApSsid", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Channel": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Channel", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApNode": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApNode", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Client": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Client", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + } + }, + "profileType": "metrics" + }, + "createdTimestamp": 1601066846980, + "lastModifiedTimestamp": 1601066846980, + "childProfileIds": [] +} +] \ No newline at end of file diff --git a/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/EquipmentExample.json b/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/EquipmentExample.json index 5eb69c5..5f5e88b 100644 --- a/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/EquipmentExample.json +++ b/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/EquipmentExample.json @@ -201,6 +201,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzU": { @@ -241,6 +242,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzL": { @@ -281,6 +283,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null } } diff --git a/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/ProfileMetrics.json b/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/ProfileMetrics.json new file mode 100644 index 0000000..4b38dbb --- /dev/null +++ b/opensync-gateway-static-docker/src/main/docker-opensync-gateway-and-mqtt/app/opensync/ProfileMetrics.json @@ -0,0 +1,53 @@ +[ +{ + "model_type": "Profile", + "id": 222, + "customerId": 2, + "profileType": "metrics", + "name": "Metrics-Profile-3-radios", + "details": { + "model_type": "ServiceMetricsCollectionConfigProfile", + "radioTypeList": [ + "is2dot4GHz", + "is5GHzL", + "is5GHzU" + ], + "metricConfigParameterMap": { + "Neighbour": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Neighbour", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApSsid": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApSsid", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Channel": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Channel", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApNode": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApNode", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Client": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Client", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + } + }, + "profileType": "metrics" + }, + "createdTimestamp": 1601066846980, + "lastModifiedTimestamp": 1601066846980, + "childProfileIds": [] +} +] \ No newline at end of file diff --git a/opensync-gateway-static-docker/src/main/docker/app/opensync/EquipmentExample.json b/opensync-gateway-static-docker/src/main/docker/app/opensync/EquipmentExample.json index 5eb69c5..5f5e88b 100644 --- a/opensync-gateway-static-docker/src/main/docker/app/opensync/EquipmentExample.json +++ b/opensync-gateway-static-docker/src/main/docker/app/opensync/EquipmentExample.json @@ -201,6 +201,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzU": { @@ -241,6 +242,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzL": { @@ -281,6 +283,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null } } diff --git a/opensync-gateway-static-docker/src/main/docker/app/opensync/ProfileMetrics.json b/opensync-gateway-static-docker/src/main/docker/app/opensync/ProfileMetrics.json new file mode 100644 index 0000000..4b38dbb --- /dev/null +++ b/opensync-gateway-static-docker/src/main/docker/app/opensync/ProfileMetrics.json @@ -0,0 +1,53 @@ +[ +{ + "model_type": "Profile", + "id": 222, + "customerId": 2, + "profileType": "metrics", + "name": "Metrics-Profile-3-radios", + "details": { + "model_type": "ServiceMetricsCollectionConfigProfile", + "radioTypeList": [ + "is2dot4GHz", + "is5GHzL", + "is5GHzU" + ], + "metricConfigParameterMap": { + "Neighbour": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Neighbour", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApSsid": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApSsid", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Channel": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Channel", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "ApNode": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "ApNode", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + }, + "Client": { + "model_type": "ServiceMetricConfigParameters", + "serviceMetricDataType": "Client", + "samplingInterval": 30, + "reportingIntervalSeconds": 60 + } + }, + "profileType": "metrics" + }, + "createdTimestamp": 1601066846980, + "lastModifiedTimestamp": 1601066846980, + "childProfileIds": [] +} +] \ No newline at end of file diff --git a/opensync-gateway-static-process/src/main/resources/app/opensync/EquipmentExample.json b/opensync-gateway-static-process/src/main/resources/app/opensync/EquipmentExample.json index 5eb69c5..5f5e88b 100644 --- a/opensync-gateway-static-process/src/main/resources/app/opensync/EquipmentExample.json +++ b/opensync-gateway-static-process/src/main/resources/app/opensync/EquipmentExample.json @@ -201,6 +201,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzU": { @@ -241,6 +242,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null }, "is5GHzL": { @@ -281,6 +283,7 @@ "forceScanDuringVoice": "disabled", "legacyBSSRate": "enabled", "beaconInterval": 100, + "dtimPeriod": 2, "deauthAttackDetection": null } } diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java index 39da67d..82c8720 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/TipWlanOvsdbClient.java @@ -208,7 +208,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface { } ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always - ovsdbDao.configureStats(ovsdbClient); + ovsdbDao.configureStatsFromProfile(ovsdbClient, opensyncAPConfig); // Check if device stats is configured in Wifi_Stats_Config table, // provision it @@ -273,7 +273,7 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface { ovsdbDao.configureInterfaces(ovsdbClient); ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig); ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig); - ovsdbDao.configureStats(ovsdbClient); + ovsdbDao.configureStatsFromProfile(ovsdbClient,opensyncAPConfig); // Check if device stats is configured in Wifi_Stats_Config table, // provision it diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java index 3564052..846a769 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java @@ -60,6 +60,8 @@ import com.telecominfraproject.wlan.profile.bonjour.models.BonjourServiceSet; import com.telecominfraproject.wlan.profile.captiveportal.models.CaptivePortalAuthenticationType; import com.telecominfraproject.wlan.profile.captiveportal.models.CaptivePortalConfiguration; import com.telecominfraproject.wlan.profile.captiveportal.models.ManagedFileInfo; +import com.telecominfraproject.wlan.profile.metrics.ServiceMetricConfigParameters; +import com.telecominfraproject.wlan.profile.metrics.ServiceMetricsCollectionConfigProfile; import com.telecominfraproject.wlan.profile.models.Profile; import com.telecominfraproject.wlan.profile.radius.models.RadiusProfile; import com.telecominfraproject.wlan.profile.radius.models.RadiusServer; @@ -2383,8 +2385,8 @@ public class OvsdbDao { int keyRefresh, boolean uapsdEnabled, boolean apBridge, NetworkForwardMode networkForwardMode, String gateway, String inet, Map dns, String ipAssignScheme, List macBlockList, boolean rateLimitEnable, int ssidDlLimit, int ssidUlLimit, int clientDlLimit, int clientUlLimit, - int rtsCtsThreshold, int fragThresholdBytes, int dtimPeriod, Map captiveMap, List walledGardenAllowlist, - Map> bonjourServiceMap) { + int rtsCtsThreshold, int fragThresholdBytes, int dtimPeriod, Map captiveMap, + List walledGardenAllowlist, Map> bonjourServiceMap) { List operations = new ArrayList<>(); Map updateColumns = new HashMap<>(); @@ -2484,10 +2486,10 @@ public class OvsdbDao { customOptions.put("ssid_dl_limit", String.valueOf(ssidDlLimit * 1000)); customOptions.put("client_dl_limit", String.valueOf(clientDlLimit * 1000)); customOptions.put("client_ul_limit", String.valueOf(clientUlLimit * 1000)); - customOptions.put("rts_threshold", String.valueOf(rtsCtsThreshold)); + customOptions.put("rts_threshold", String.valueOf(rtsCtsThreshold)); customOptions.put("frag_threshold", String.valueOf(fragThresholdBytes)); customOptions.put("dtim_period", String.valueOf(dtimPeriod)); - + if (enable80211k) { customOptions.put("ieee80211k", String.valueOf(1)); @@ -2903,8 +2905,8 @@ public class OvsdbDao { ssidConfig.getVlanId(), rrmEnabled, enable80211r, mobilityDomain, enable80211v, enable80211k, minHwMode, enabled, keyRefresh, uapsdEnabled, apBridge, ssidConfig.getForwardMode(), gateway, inet, dns, ipAssignScheme, macBlockList, - rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, rtsCtsThreshold,fragThresholdBytes,dtimPeriod, - captiveMap, walledGardenAllowlist, bonjourServiceMap); + rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, rtsCtsThreshold, + fragThresholdBytes, dtimPeriod, captiveMap, walledGardenAllowlist, bonjourServiceMap); } catch (IllegalStateException e) { // could not provision this SSID, but still can go on @@ -3228,6 +3230,38 @@ public class OvsdbDao { } + public void configureStatsFromProfile(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) { + + + if (opensyncApConfig.getMetricsProfiles().isEmpty()) { + configureStats(ovsdbClient); + } else { + + for (Profile metricsProfile : opensyncApConfig.getMetricsProfiles()) { + + + ServiceMetricsCollectionConfigProfile details = ((ServiceMetricsCollectionConfigProfile) metricsProfile + .getDetails()); + + for (Entry entry : details.getMetricConfigParameterMap() + .entrySet()) { + + //TODO: implement me + LOG.debug("Metrics Config Map Entry {}", entry); + configureStats(ovsdbClient); // replace with profile values + + + } + + + } + + + } + + + } + public void configureStats(OvsdbClient ovsdbClient) { try { diff --git a/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java b/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java index adee147..a320796 100644 --- a/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java +++ b/opensync-gateway/src/test/java/com/telecominfraproject/wlan/opensync/ovsdb/OpensyncGatewayTipWlanOvsdbClientTest.java @@ -130,7 +130,7 @@ public class OpensyncGatewayTipWlanOvsdbClientTest { Mockito.verify(ovsdbDao).removeAllStatsConfigs(ovsdbClient); Mockito.verify(ovsdbDao).configureWifiRadios(ovsdbClient, apConfig); Mockito.verify(ovsdbDao).configureSsids(ovsdbClient, apConfig); - Mockito.verify(ovsdbDao).configureStats(ovsdbClient); + Mockito.verify(ovsdbDao).configureStatsFromProfile(ovsdbClient, apConfig); }